Python 2.7对超类属性的访问不干燥?

Python 2.7对超类属性的访问不干燥?,python,python-2.7,inheritance,dry,Python,Python 2.7,Inheritance,Dry,我非常喜欢Don't Repeat Yourself(DRY)原则,作为它的一个实例,我不喜欢在其定义中使用类的名称。(如果我想更改类名,我还必须更改它在类定义中出现的所有内容,我可能会忘记一个。) 现在,我在文档中读到的访问超类属性的典型习惯用法包含类名,如 class A(object): def method(self): print('Hi!') class B(A): def method(self): super(B, self).me

我非常喜欢Don't Repeat Yourself(DRY)原则,作为它的一个实例,我不喜欢在其定义中使用类的名称。(如果我想更改类名,我还必须更改它在类定义中出现的所有内容,我可能会忘记一个。)

现在,我在文档中读到的访问超类属性的典型习惯用法包含类名,如

class A(object):
    def method(self):
        print('Hi!')
class B(A):
    def method(self):
        super(B, self).method()  # fixed reference to B, not DRY
当子类化B时,使用“type(self)”或“self.\uuuuu class\uuuuuu”将导致无限递归

在这种情况下,我必须跳伞吗?或者,在子类的定义中,是否还有其他神奇的属性指向该子类

使用子类的显式名称。就我所知,这只是Python2.7的一个不幸且不可避免的缺陷

然而,这似乎对我有效:

class A(object):
    def method(self):
        print('Class A method')
class B(A):
    def __init__(self):
        self.myclass = B
        super(self.myclass, self).__init__()
    def method(self):
        print('Class B method')
        super(self.myclass, self).method()

这会在B中留下一个显式类名,但我可以通过使用self.myclass来避免任何其他类名。

我知道这是一个老问题,但我想把它留在这里以供参考

可以自动添加包含具有的类的属性

类似这样的方法会奏效:

class Metaclass(type):
  def __init__(cls, name, bases, attrs):
    cls.what_class = cls

class A(metaclass=Metaclass):
  pass

class B(A):
  pass

print(A().what_class) # <class 'A'>
print(B().what_class) # <class 'B'>
类元类(类型):
定义初始值(cls、名称、基数、属性):
cls.what_class=cls
A类(元类=元类):
通过
B(A)类:
通过
打印(A().什么类)
打印(B().什么类)

如果你想在另一个元类中使用它,我会研究。

谢谢你的文档参考,Tom。但是,尽管这可能会减少“B”类定义中“B”的数量,但它仍然不是干巴巴的。既然到目前为止还没有其他的答案,我认为这是不可避免的,正如你所写的。