我可以调用python类层次结构中的超类中的方法而不使用当前类的名称吗

2024-07-07 07:00:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我知道在python的超类中调用方法的最好方法是wirte:

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

但是,这意味着如果我更改了类Foo的名称,或者我将代码剪切并粘贴到另一个类中,我必须记住更改调用超类中方法的行。有什么办法可以解决这个问题吗?最起码是恼人的,最坏的是很容易出错。你知道吗


Tags: 方法代码self名称foo粘贴defbar
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()调用被分配给\uu super属性。名称损坏必须手动完成,但实例和子类将相应地进行处理。现在您甚至不必调用super,只需使用\uu 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
>>> 

当然,我发布这个只是为了学习,我不建议使用它。这是一种接近excess of cleverness的东西,有些人在Python中谴责这种东西。你知道吗

在python3中,您可以编写super(),它将为您填充类。你知道吗

在python2中,需要编写类的名称。但是更改类名并不是一个常见的操作,所以我并不认为这有多困难。如果您更改了类的名称,您只需要记住搜索和替换它,但是您可能无论如何都必须这样做,因为它的子类也会通过名称来引用它。你知道吗

相关问题 更多 >