1.重写__str__()方法:
当不调用重写__str__()方法时,会打印出:
<main.A object at 0x0000024AD3187400>
这是因为调用该类,打印输出时候,会默认执行__str__()方法,类似于c语言中的主方法main()。
class A:
#pass #会打印出<__main__.A object at 0x0000024AD3187400>
def __str__(self): #重写方法
return "123"
a = A()
print(a)
运行结果:
重写为了:123
2.多继承
在pyhon中是支持多继承的,一个字类可以有多个父类。这种做法有好处也有缺点:
好处:可以让字类继承多个父类之后,具有多个属性,比较灵活。
缺点:这样会被“类的整体层次”搞的异常复杂,就像现实生活中,儿子有好多个爸爸,会乱套的,所以尽量避免使用。
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()
结果:
cc
bb
aa
MRO(Method Resolution Order):方法解析顺序。
我们可以通过 mro()方法获得“类的层次结构”,方法解析顺序也是按照这个“类的层次结构”寻找的。
Python 支持多继承,如果父类中有相同名字的方法,在子类没有指定父类名时,解释器将“从左向右”按顺序搜索。
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()) #打印类的层次结构
c.say() #解释器寻找方法是“从左到右”的方式寻找,此时会执行 B类中的 say()
super()获得父类定义
在子类中,如果想要获得父类的方法时,我们可以通过 super()来做。
super()代表父类的定义,不是父类对象。
class A:
def say(self):
print("A: ",self)
print("say AAA")
class B(A):
def say(self):
#A.say(self) 调用父类的 say 方法
super().say() #通过 super()调用父类的方法
print("say BBB")
b = B()
b.say()
结果:
A: <__main__.B object at 0x00000292B4F5EA58>
say AAA
say BBB
多态
多态(polymorphism)是指同一个方法调用由于对象不同可能会产生不同的行为。
在现实生活中,我们有很多例子。比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休息是玩游戏,程序员是敲代码。同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。
关于多态要注意:
- 多态是方法的多态,属性没有多态。
- 多态的存在有 2 个必要条件:继承、方法重写。
class Animal:
def __init__(self,name,sound):
self.name = name
self.sound = sound
def print_say(self):
print("{0}发出了{1: ^4}的声音".format(self.name,self.sound))
class Dog(Animal):
def __init__(self,name,sound):
super(Dog, self).__init__(name,sound)
super().print_say()
class Cat(Animal):
def __init__(self,name,sound):
# super(Cat, self).__init__(name,sound) #广度优先继承
Animal.__init__(self,name,sound) #深度优先继承
super().print_say()
d = Dog('dog','旺旺')
c = Cat('cat','喵喵')
结果:
dog发出了 旺旺 的声音
cat发出了 喵喵 的声音