0

我知道在 python 中调用超类中的方法的最佳方法是编写:

class Foo(Bar):
    def foo(self):
        ...
        super(Foo, self).foo()
        ...

但是,这意味着如果我更改类 Foo 的名称或将代码剪切并粘贴到另一个类中,我必须记住更改调用超类中的方法的行。有没有办法解决这个问题?至少很烦人,最坏的情况是很容易出错。

4

2 回答 2

1

在 Python 3 中,您可以编写super()它,它会为您填写课程。

在 Python 2 中,您需要编写类的名称。但是更改类的名称并不完全是一种常见的操作,所以我真的不认为这有多困难。如果你改变它,你只需要记住搜索和替换类的名称——但是你可能无论如何都必须这样做,因为它的子类也会按名称引用它。

于 2012-04-21T20:51:39.937 回答
0

您的意思是对每个人来说都是简单、安全且易于理解的方式(就 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 中谴责的过分聪明的事情。

于 2012-04-21T22:15:07.620 回答