为什么Python 2的`super`需要显式的类和自我参数?

时间:2016-04-29 03:48:38

标签: python oop inheritance

This Python 2 example

class LoggingDict(dict):
    # Simple example of extending a builtin class
    def __setitem__(self, key, value):
        logging.info('Setting %r to %r' % (key, value))
        super(LoggingDict, self).__setitem__(key, value)

this Python 3 example

class LoggingDict(dict):
    # Simple example of extending a builtin class
    def __setitem__(self, key, value):
        logging.info('Setting %r to %r' % (key, value))
        super().__setitem__(key, value)

说明Python 2的super需要显式类和self参数(但Python 3不是)。这是为什么?这似乎是一个恼人的限制。

1 个答案:

答案 0 :(得分:0)

AKS评论中的链接提供了答案:

让我们说在Python 2的例子中,我认为“我不喜欢那个显式的类引用。如果我更改类的名称或移动此代码并忘记更新它会怎样?”。让我们说,我想,我会用class LoggingDict(dict): # Simple example of extending a builtin class def __setitem__(self, key, value): logging.info('Setting %r to %r' % (key, value)) super(self.__class__, self).__setitem__(key, value) 替换显式类名,并写道:

SpecialisedLoggingDict

现在我创建了一个名为LoggingDict __setitem__的子类(它不会覆盖__setitem__),实例化它并在其上调用self

现在SpecialisedLoggingDict引用super的实例,因此LoggingDict返回LoggingDict.__setitem__,我们直接返回__class__,进入无限递归。

关键点在于,在 Python 2中,一个方法并不真正知道它所定义的类,它只知道被调用的实例的类。 Python 3 does compile-time "magic",在函数中添加super()单元格,以便在没有显式类引用的情况下使用descendant