python3 super apply

1、子类自己没有的方法、属性如果父类有,子类可以调用父类的方法和属性使用;
class Animal():
   
 def __init__(self,name):
        
self.name = name
        
print(self.name)

    d

ef greet(self):
        
print('hello, i am %s' % self.name)

class Dog(Animal):
    
pass


dog = Dog('dog')
dog.greet()
print(dog.name)

输出:

dog

hello, i am dog

dog

2、子类和父类共有的属性和方法,这时子类想要调用共有的属性和方法需要用到super;
class Animal():
    def __init__(self,name): #构造函数称作属性
        self.name = name
        print(self.name)

    def greet(self):  #方法
        print('hello, i am %s' % self.name)

class Dog(Animal):
    def __init__(self,name):
        super().__init__(name)
        self.name = 3

    def greet(self):
        super().greet()
        print('wang wang')

dog = Dog('dog')
dog.greet()
print(dog.name)
输出:
dog
hello, i am 3
wang wang
3
3、多继承中super的使用;
       看了上面的使用,你可能会觉得 super 的使用很简单,无非就是获取了父类,并调用父类的方法。其实,在上面的情况下,super 获得的类刚好是父类,但在其他情况就不一定了,super 其实和父类没有实质性的关联

class Base(object):
    def __init__(self):
        print ("enter Base")
        print ("leave Base")

class A(Base):
    def __init__(self):
        print ("enter A")
        super(A, self).__init__() #python3 可以使用super().__init__()
        print ("leave A")

class B(Base):
    def __init__(self):
        print ("enter B")
        super(B, self).__init__()
        print ("leave B")

class C(A, B):
    def __init__(self):
        print ("enter C")
        super(C, self).__init__()
        print ("leave C")

c = C()
print(C.mro())

输出:

enter C
enter A
enter B
enter Base
leave Base
leave B
leave A
leave C
[<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class '__main__.Base'>, <class 'object'>]

事实上,对于你定义的每一个类,Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表它代表了类继承的顺序,我们可以使用下面的方式获得某个类的 MRO 列表:

>>> C.mro()   # or C.__mro__ or C().__class__.mro()
[__main__.C, __main__.A, __main__.B, __main__.Base, object]

那这个 MRO 列表的顺序是怎么定的呢,它是通过一个 C3 线性化算法来实现的,这里我们就不去深究这个算法了,感兴趣的读者可以自己去了解一下,总的来说,一个类的 MRO 列表就是合并所有父类的 MRO 列表,并遵循以下三条原则:

  • 子类永远在父类前面
  • 如果有多个父类,会根据它们在列表中的顺序被检查
  • 如果对下一个类存在两个合法的选择,选择第一个父类

参见:http://funhacks.net/explore-python/Class/super.html

猜你喜欢

转载自blog.csdn.net/qq_42527487/article/details/84334089