- object有一个__str__()方法,用于返回一个对于对象的描述。内置函数str(对象),调用的就是__str__()
- __str__()经常用于print()方法,帮助我们查看对象的信息。__str__()可以重写
多重继承
Python支持多重继承,一个子类可以有多个直接父类。
class A:
def aa(self):
print("aa")
class B:
def bb(self):
print("bb")
class C(B,A):
def cc(self):
print("cc")
c = C()
c.cc()
c.bb()
c.aa()
MRO方法解析顺序
Python支持多继承,如果父类中有相同名字的方法,在子类中没有指定父类名是,解释器将从左向右按顺序搜索。
MRO(Method Resolution Order):方法解析顺序。我们可以通过mro()方法获得类的层次结构,方法解析顺序也是按照这个类的层次结构寻找的。
class A:
def aa(self):
print("aa")
def say(self):
print("say AAA!")
class B:
def bb(self):
print("bb")
def say(self):
print("say BBB!")
class C(B,A):
def cc(self):
print("cc")
c = C()
print(C.mro()) #打印类的层次结构
# [<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>]
c.say() #解释器寻找方法是“从左到右”的方式寻找,此时会执行B类中的say()
# say BBB!
super()获得父类的定义
在子类中,如果想要获得弗雷德方法,可以通过super()来实现。
super()代表父类的定义,不是父类对象。
调用父类的构造方法:super(子类名称,self).__init__(参数列表)
class A:
def __init__(self):
print("A的构造方法")
def say(self):
print("A: ",self)
print("say AAA")
class B(A):
def __init__(self):
super(B,self).__init__() #调用父类的构造方法
print("B的构造方法")
def say(self):
#A.say(self) 调用父类的say方法
super().say() #通过super()调用父类的方法
print("say BBB")
b = B()
b.say()
多态:同一个方法调用由于对象不同,产生不同的行为。
多态是方法的多态,属性没有多态。
多态的存在有两个必要条件:继承、方法重写
class Animal:
def shout(self):
print("动物叫了一声")
class Dog(Animal):
def shout(self):
print("小狗汪汪汪")
class Cat(Animal):
def shout(self):
print("小猫喵喵喵")
def animalShout(a):
a.shout()
animalShout(Dog()) # 小狗汪汪汪
animalShout(Cat()) # 小猫喵喵喵