美文网首页
python super

python super

作者: 手捧樱花v | 来源:发表于2020-09-07 15:49 被阅读0次
    class Animal(object):
        def __init__(self, name):
            self.name = name
        def greet(self):
            print 'Hello, I am %s.' % self.name
    
    class Dog(Animal):
        def greet(self):
            super(Dog, self).greet()   # Python3 可使用 super().greet()
            print 'WangWang...'
    

    在上面,Animal 是父类,Dog 是子类,我们在 Dog 类重定义了 greet 方法,为了能同时实现父类的功能,我们又调用了父类的方法,看下面的使用:

    >>> dog = Dog('dog')
    >>> dog.greet()
    Hello, I am dog.
    WangWang..
    
    class Base(object):
        def __init__(self, a, b):
            self.a = a
            self.b = b
    
    class A(Base):
        def __init__(self, a, b, c):
            super(A, self).__init__(a, b)  # Python3 可使用 super().__init__(a, b)
            self.c = c
    

    菱形继承

    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__()
            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()
    enter C
    enter A
    enter B
    enter Base
    leave Base
    leave B
    leave A
    leave C
    

    为什么 enter A 的下一句不是 enter Base 而是 enter B
    事实上,对于你定义的每一个类,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 列表,并遵循以下三条原则:

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

    相关文章

      网友评论

          本文标题:python super

          本文链接:https://www.haomeiwen.com/subject/fpclektx.html