类的继承

继承Inheritace: 代码复用的高级抽象

基类-----派生类:1.基类属性是继承,2.基类方法的继承,3.派生类新增的属性,4.派生类新增的方法

object类是所有类的基类

保留属性和保留方法本质上是object类的属性和方法

print (object.__name__)
print(object.__qualname__)
print(object.__base__)
print(object.__class__)
print(object.__module__)


运行结果:
object
object
None
<class 'type'>

1.python对象的三要素:标识,类型,值

标识identity:对象一旦构建不会改变,用id() 获得,一般是内存地址

类型type:对象的类型,用type() 获得

值value :分为可变mutable和不可变immutable

2、两个与基础类有关的python内置功能

id(x):返回x的标识,Cpython用内存地址表示

x  is  y :  判断x和y 的标识是否相等,不判断值(只要在同一内存空间,则标识相等)

class Democlass:
    count = 0
    def __init__(self,name):
        self.name = name
        Democlass.count += 1
    def getName(self):
        return self.name
class HumanNameClass(Democlass):
    def printName(self):
        return str(Democlass.count) + self.name
dc1 = Democlass("老王")
print(id(dc1),type(dc1))
print (id(Democlass),type(Democlass))
print(dc1 is Democlass)
print(type(object),type(type))  #type 的类型就是type,object的类型也是type

运行结果:
1688090982328 <class '__main__.Democlass'>
1688091138840 <class 'type'>
False
<class 'type'> <class 'type'>

二、重载

1、属性重载

class Democlass:
    count = 0
    def __init__(self,name):
        self.name = name
        Democlass.count += 1
class HumanNameclass(Democlass):
    count = 99      #属性重载
    def __init__(self,name):
        self.name =name
        HumanNameclass.count-=1
    def printcount(self):
        return str(HumanNameclass.count)+self.name
dc1 = HumanNameclass("老王")
print(dc1.printcount())


运行结果:98老王

2、类的方法重载

完全重载:派生类完全重定义与1基类相同名称的方法

增量重载:派生类定义与基类相同名称的方法  增量冲在:super()

class Democlass:
    count = 0
    def __init__(self,name):
        self.name = name
        Democlass.count += 1
    def printcount(self):
        return str(Democlass.count) + self.name
class HumanNameclass(Democlass):
    def __init__(self,name):
        self.name =name
    def printcount(self):   #方法重载,增量重载
        return super().printcount()+"同志"
dc1 = HumanNameclass("老王")
print(dc1.printcount())

运行结果:0老王同志  #由于方法重载,所以并未执行Democlass中的构造方法使count+1,所以count=0

3、类的多继承

python采用深度优先,从左至右的方法实施多继承

class Democlass:
    def __init__(self,name):
        self.name = name
    def printname(self):
        return self.name
class nameclass:
    def __init__(self,title):
        self.nich = title
    def printname(self):
        return self.nich + "同志"
class HumanNameclass(nameclass,Democlass): 
    pass
dc1 = HumanNameclass("老王")
print(dc1.printname()) #按照深度优先,从左至右的寻找方法,访问的使是nameclass基类的printname()方法

运行结果:老王同志

super()增量继承也按照深度优先,从左至右寻找对应基类方法

class Democlass:
    def __init__(self,name):
        self.name = name
    def printname(self):
        return self.name
class nameclass:
    def __init__(self,title):
        self.nich = title
    def printname(self):
        return self.nich + "同志"
class HumanNameclass(nameclass,Democlass):
    def printname(self):
        return super().printname() + "你好"
dc1 = HumanNameclass("老王")
print(dc1.printname()) 

运行结果:老王同志你好

 

posted @ 2020-04-08 18:25  小小鱼鱼儿  阅读(60)  评论(0)    收藏  举报