继承: 在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(
继承:
在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类
class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass
查看继承:__bases__
print( SubClass1.__bases__) #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类 (<class ‘__main__.ParentClass1‘>,) print(SubClass2.__bases__) (<class ‘__main__.ParentClass1‘>, <class ‘__main__.ParentClass2‘>)
---------------------------------------------------------------------
#打印父类
print(ParentClass.__bases__)
(<class"object”>) # python3 -新式类# 没有继承父类默认继承object
派生:当然子类也可以添加自己新的属性或者在自己这里重新定义这些属性(不会影响到父类),需要注意的是,一旦重新定义了自己的属性且与父类重名,那么调用新增的属性时,就以自己为准了。
class Animal: def __init__(self,eat,walk,drink): self.eat = eat self.walk = walk self.drink = drink
def eat(self):
print(‘吃药回血‘)
self.hp+=100
class Dog(Animal): def __init__(self,eat,walk,drink,lookdoor,bark): # Animal.__init__(self,eat,walk,drink) # 单独再调用一次
#super().__init(eat,walk,drink) # 查找父类,等价于上一条,但无需上传self
self.lookdoor = lookdoor # 派生属性 self.bark = bark
def eat(self):
Animal.eat(self) # 如果既想实现新的功能也想使用父类原本的功能,还需要在子类中再调用父类
self.teeth = 2
def bite(self,person): # 派生方法
person.hp -= self.aggr
jin = Dog("肉","跑","水","看门","汪汪") print(jin.bark)
# 父类中没有的属性 在子类中出现 叫做派生属性 ------例如:Dog中的lookdoor
# 父类中没有的方法 在子类中出现 叫做派生方法
# 只要是子类的对象调用,子类中有的名字 一定用子类的,子类中没有才找父类的,如果父类也没有报错
# 如果父类 子类都有 用子类的
# 如果还想用父类的,单独调用父类的:
# 父类名.方法名 需要自己传self参数
# super().方法名 不需要自己传self
class Animal: def __init__(self,name,aggr,hp): self.name = name self.aggr = aggr self.hp = hp def eat(self): print(‘吃药回血‘) self.hp+=100 class Dog(Animal): def __init__(self,name,aggr,hp,kind): super().__init__(name,aggr,hp) # 只在新式类中有,python3中所有类都是新式类 self.kind = kind # 派生属性 def eat(self):print(‘dog eating‘) # jin = Dog(‘金老板‘,200,500,‘teddy‘) # print(jin.name) # jin.eat() #dog eating
# super(Dog,jin).eat() #吃药回血
# 正常的代码中 单继承 === 减少了代码的重复
# 继承表达的是一种 子类是父类的关系
多继承:
新式类 继承object类的才是新式类 广度优先
经典类 如果你直接创建一个类在2.7中就是经典类 深度优先
print(D.mro())
D.mro()-------------直接显示继承顺序
单继承 : 子类有的用子类 子类没有用父类
多继承中,我们子类的对象调用一个方法,默认是就近原则,找的顺序是什么?
经典类中 深度优先
新式类中 广度优先
python2.7 新式类和经典类共存,新式类要继承object
python3 只有新式类,默认继承object
经典类和新式类还有一个区别 mro方法只在新式类中存在
super 只在python3中存在
super的本质 :不是单纯找父类 而是根据调用者的节点位置的广度优先顺序来的
class A(object): def test(self): print(‘from A‘) class B(A): def test(self): print(‘from B‘) class C(A): def test(self): print(‘from C‘) class D(B): def test(self): print(‘from D‘) class E(C): def test(self): print(‘from E‘) class F(D,E): # def test(self): # print(‘from F‘) pass f1=F() f1.test() print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性 #新式类继承顺序:F->D->B->E->C->A #经典类继承顺序:F->D->B->A->E->C #python3中统一都是新式类 #pyhon2中才分新式类与经典类