__str__()方法、多继承、MRO、super、多态

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

__str__()方法、多继承、MRO、super、多态_第1张图片

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)是指同一个方法调用由于对象不同可能会产生不同的行为。
  在现实生活中,我们有很多例子。比如:同样是调用人的休息方法,张三的休息是睡觉,李四的休息是玩游戏,程序员是敲代码。同样是吃饭的方法,中国人用筷子吃饭,英国人用刀叉吃饭,印度人用手吃饭。

关于多态要注意:

  1. 多态是方法的多态,属性没有多态。
  2. 多态的存在有 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发出了 喵喵 的声音

你可能感兴趣的:(python类,py类继承_多态)