2024-07-07 07:00:27 发布
网友
我知道在python的超类中调用方法的最好方法是wirte:
class Foo(Bar): def foo(self): ... super(Foo, self).foo() ...
但是,这意味着如果我更改了类Foo的名称,或者我将代码剪切并粘贴到另一个类中,我必须记住更改调用超类中方法的行。有什么办法可以解决这个问题吗?最起码是恼人的,最坏的是很容易出错。你知道吗
你的意思是对每个人来说简单、安全和容易理解的方式(就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(),它将为您填充类。你知道吗
super()
在python2中,需要编写类的名称。但是更改类名并不是一个常见的操作,所以我并不认为这有多困难。如果您更改了类的名称,您只需要记住搜索和替换它,但是您可能无论如何都必须这样做,因为它的子类也会通过名称来引用它。你知道吗
你的意思是对每个人来说简单、安全和容易理解的方式(就super()而言)?你知道吗
简而言之:没有
长话短说:是的。有几种方法可以做到这一点。其中之一是使用元类在类初始化期间自动创建super()。你知道吗
因此,对正在创建的类的super()调用被分配给\uu super属性。名称损坏必须手动完成,但实例和子类将相应地进行处理。现在您甚至不必调用super,只需使用\uu super属性即可。你知道吗
当然,我发布这个只是为了学习,我不建议使用它。这是一种接近excess of cleverness的东西,有些人在Python中谴责这种东西。你知道吗
在python3中,您可以编写
super()
,它将为您填充类。你知道吗在python2中,需要编写类的名称。但是更改类名并不是一个常见的操作,所以我并不认为这有多困难。如果您更改了类的名称,您只需要记住搜索和替换它,但是您可能无论如何都必须这样做,因为它的子类也会通过名称来引用它。你知道吗
相关问题 更多 >
编程相关推荐