我知道在 python 中调用超类中的方法的最佳方法是编写:
class Foo(Bar):
def foo(self):
...
super(Foo, self).foo()
...
但是,这意味着如果我更改类 Foo 的名称或将代码剪切并粘贴到另一个类中,我必须记住更改调用超类中的方法的行。有没有办法解决这个问题?至少很烦人,最坏的情况是很容易出错。
我知道在 python 中调用超类中的方法的最佳方法是编写:
class Foo(Bar):
def foo(self):
...
super(Foo, self).foo()
...
但是,这意味着如果我更改类 Foo 的名称或将代码剪切并粘贴到另一个类中,我必须记住更改调用超类中的方法的行。有没有办法解决这个问题?至少很烦人,最坏的情况是很容易出错。
在 Python 3 中,您可以编写super()
它,它会为您填写课程。
在 Python 2 中,您需要编写类的名称。但是更改类的名称并不完全是一种常见的操作,所以我真的不认为这有多困难。如果你改变它,你只需要记住搜索和替换类的名称——但是你可能无论如何都必须这样做,因为它的子类也会按名称引用它。
您的意思是对每个人来说都是简单、安全且易于理解的方式(就 super() 而言)?
简短的回答:没有。
长答案:是的。有几种方法可以做到这一点。其中之一是使用元类在类初始化期间自动创建 super()。
>>> class AutoSuper(type):
... def __init__(cls, name, bases, dict):
... super(AutoSuper, cls).__init__(name, bases, dict)
... setattr(cls, '_%s__super'%name, super(cls))
...
>>>
因此,对正在创建的类的 super() 调用分配给 __super 属性。名称修改必须手动完成,但实例和子类会相应地命中它。现在您甚至不必调用 super,只需使用 __super 属性即可。
>>> class A(object):
... __metaclass__ = AutoSuper
... def m(self):
... print 'A'
...
>>>
>>> class B(A):
... def m(self):
... print 'B'
... self.__super.m()
...
>>>
>>> class C(B):
... def m(self):
... print 'C'
... self.__super.m()
...
>>> obj = C()
>>> obj.m()
C
B
A
>>>
当然,我只是出于学习目的发布此内容,我不建议使用它。这就是某些人在 Python 中谴责的过分聪明的事情。