Python 2.7 访问超类属性不DRY?
Python 2.7 access to superclass attributes not DRY?
我非常喜欢不要重复自己 (DRY) 原则,作为它的一个实例,我不喜欢在其定义中使用 class 的名称。 (如果我想更改 class 名称,我还必须更改 class 定义中出现的所有名称,我可能会忘记一个。)
现在我在文档中读到的访问 superclass 属性的典型习惯用法包含 class 名称,如
class A(object):
def method(self):
print('Hi!')
class B(A):
def method(self):
super(B, self).method() # fixed reference to B, not DRY
使用 "type(self)" 或 "self.__class__" 代替将在子classing B 时导致无限递归。
在这种情况下我必须跳过 DRY 吗?或者是否有其他一些神奇的属性 - 在 subclass 的定义中 - 指的是 subclass?
example in the documentation 使用 child class 的显式名称。据我所知,这只是 Python 2.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 中留下一次显式 class 名称,但我可以通过使用 self.myclass.
来避免出现任何其他名称
我知道这是一个老问题,但我想把它留在这里供参考。
可以自动添加包含 class 和 metaclasses 的属性。
像这样的东西会起作用:
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'>
如果您想将它与另一个元class一起使用,我会研究this question。
我非常喜欢不要重复自己 (DRY) 原则,作为它的一个实例,我不喜欢在其定义中使用 class 的名称。 (如果我想更改 class 名称,我还必须更改 class 定义中出现的所有名称,我可能会忘记一个。)
现在我在文档中读到的访问 superclass 属性的典型习惯用法包含 class 名称,如
class A(object):
def method(self):
print('Hi!')
class B(A):
def method(self):
super(B, self).method() # fixed reference to B, not DRY
使用 "type(self)" 或 "self.__class__" 代替将在子classing B 时导致无限递归。
在这种情况下我必须跳过 DRY 吗?或者是否有其他一些神奇的属性 - 在 subclass 的定义中 - 指的是 subclass?
example in the documentation 使用 child class 的显式名称。据我所知,这只是 Python 2.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 中留下一次显式 class 名称,但我可以通过使用 self.myclass.
来避免出现任何其他名称我知道这是一个老问题,但我想把它留在这里供参考。
可以自动添加包含 class 和 metaclasses 的属性。
像这样的东西会起作用:
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'>
如果您想将它与另一个元class一起使用,我会研究this question。