在Python 2.7和3中,我使用以下方法调用一个超类的函数:

class C(B):
    def __init__(self):
        B.__init__(self)

我认为用super(B, self).__init__()和python3 super().__init__()替换B.__init__(self)也是可能的.

这样做有什么优点或缺点吗?至少对我来说,从B直接调用它更有意义,但也许有一个很好的理由,super()只能在使用元类时使用(我通常避免使用).

推荐答案

对于单继承,super()只是一种更奇特的方式来引用基类型.这样,您可以使代码更易于维护,例如,如果您想更改基类型的名称.当你在任何地方都使用super时,你只需要在class行中更改它.

但真正的好处来自多重继承.当使用super时,一次调用不仅会自动调用all个基类型的方法(按照正确的继承顺序),还会确保每个方法只被调用一次.

这基本上允许类型具有diamond属性,例如,您有一个单一的基类型A,以及两个从A派生的类型BC.然后你有一个D类型,它继承了BC(使它隐式继承了A两次).如果现在明确地调用基类型的方法,那么最终将调用A的方法两次.但使用super,它只会调用一次:

class A (object):
    def __init__ (self):
        super().__init__()
        print('A')

class B (A):
    def __init__ (self):
        super().__init__()
        print('B')

class C (A):
    def __init__ (self):
        super().__init__()
        print('C')

class D (C, B):
    def __init__ (self):
        super().__init__()
        print('D')

当我们现在实例化D时,我们得到以下输出:

>>> D()
A
B
C
D
<__main__.D object at 0x000000000371DD30>

现在,让我们再次手动调用基类型的方法:

class A2 (object):
    def __init__ (self):
        print('A2')

class B2 (A2):
    def __init__ (self):
        A2.__init__(self)
        print('B2')

class C2 (A2):
    def __init__ (self):
        A2.__init__(self)
        print('C2')

class D2 (C2, B2):
    def __init__ (self):
        B2.__init__(self)
        C2.__init__(self)
        print('D2')

这是输出:

>>> D2()
A2
B2
A2
C2
D2
<__main__.D2 object at 0x0000000003734E48>

如你所见,A2出现两次.这通常不是你想要的.当您手动调用使用super的一个基本类型的方法时,它会变得更加混乱.所以,你应该用super()来确保一切正常,这样你就不用太担心了.

Python-3.x相关问答推荐

Pandas 数据帧断言等同于NaN

Python:字典和列表:在列表字典中搜索子列表的有效方法

丢弃重复的索引,并在多索引数据帧中保留一个

在Python中从列创建新行

我想判断df_entry_log[AM_PM],并根据测试填充列

将列表转换为 pandas 数据框,其中列表包含字典

从另一个云函数调用带有仅允许内部流量标志的云函数时出现问题

torch.stack([t1, t1, t1], dim=1)与torch.hstack([t1, t1, t1])之间有什么区别?

「Python Pandas」多级索引列和行匹配,如果列和行名称相似,则排除这些单元格中的值添加

在新数据帧上自动提取两个字符串 python 之间的相等性

使用 Python 在特定组的列中设置上限

单击图形时 plotly graph_objects 持久性数据

如何使用 django rest 框架在 self forienkey 中删除多达 n 种类型的数据?

列出相同索引的Pandas

如何使用 Selenium by class_name 从大学橄榄球数据中抓取图像 url 列表

在两个数据框之间查找相等的列

aiohttp+sqlalchemy:在回滚无效事务之前无法重新连接

Python configparser 不会接受没有值的键

新项目:Python 2 还是 Python 3?

有效地判断一个元素是否在列表中至少出现 n 次