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)
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不是)。这是为什么?这似乎是一个恼人的限制。
答案 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
。