继承
# 继承
class Animal:
atype="哺乳动物"
def __init__(self,name,age,sex) -> None:
self.name=name
self.age=age
self.sex=sex
def eat(self):
print(f"{self.name} is eating...")
class Person(Animal):
atype="哺乳高等动物"
def __init__(self, name, age, sex,hobbie) -> None:
super().__init__(name, age, sex)
self.hobbie=hobbie
def talk(self):
print(f"[perspn] {self.name} is talking,his hobbie is {self.hobbie}")
def eat(self): # 重写父类方法
# Animal.eat(self) # 若想在父类方法的基础上扩充,需要把父类方法先写进来
super().eat() # 本行代码和上一行代码实现的效果是一样的
print("人在优雅的吃...") # 在全局调用子类时,会先执行父类方法,再执行子类方法。
class Dog(Animal):
def chase_rabit(self):
print("狗在追兔子...")
if __name__=="__main__":
p=Person("Alex",22,"M","basketball")
d=Dog("Bob",5,"M")
p.eat()
p.talk()
d.eat()
print(p.atype)
print(d.atype)
多继承
# 多继承
class ShenxianBase:
def fight(self):
print("神仙始祖们在天界打架...")
class Shenxian:
"""神仙类"""
def fly(self):
print("神仙都会飞...")
# def fight(self):
# print("神仙在打架...")
class MonkeyBase:
def fight(self):
print("猿猴在打架...")
class Monkey(MonkeyBase):
"""猴子类"""
def eat(self):
print("猴子都喜欢吃桃子...")
def fight(self):
print("猴子在打架")
# py2.3之前,经典类(class A:)使用深度优先,新式类(class A(object):)使用广度优先
# py3中,经典类和新式类使用的都是广度优先
class MonkeyKing(Shenxian,Monkey): # 同时继承神仙和猴子,当多个父类同时拥有一个名字的实例方法时,(顺序遵循广度优先(第一个子类->...第n个子类->第一个子类的父类->...第n个子类的父类))
def play_golden_stick(self):
print("孙悟空在玩金箍棒...")
m=MonkeyKing()
m.fly()
m.eat()
m.play_golden_stick()
m.fight()
多继承继承顺序,C3算法
class A:
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 B2:
def test(self):
print("from B2")
class C2:
def test(self):
print("from C2")
class D(B,B2):
def test(self):
print("from D")
class E(C,C2):
def test(self):
print("from E")
class F(D,E):
def test(self):
print("from F")
if __name__=="__main__":
f=F()
f.test()
print(F.__mro__)