Fin*_*sen 5 python inheritance attributes subclass wtforms
假设有一个类属性是根据另一个类属性计算的:
class ClassA(object):
attr1=5
attr2=attr1+10
>>ClassA.attr2
15
Run Code Online (Sandbox Code Playgroud)
然后在子类中,我想更新第一个类属性以导致第二个类属性发生更改,而不重新定义第二个类属性。例如:
class ClassB(ClassA):
attr1=10
Run Code Online (Sandbox Code Playgroud)
我希望发生的是:
>>ClassB.attr2
20
Run Code Online (Sandbox Code Playgroud)
然而,情况并非如此,因为 attr2 是在重新定义 attr1 之前计算的。有没有办法在不重新定义第二个属性的情况下获得这种行为?
(我的特定用例是使用从 Form 类属性派生的 Field 属性(格式、选择等)定义 WTForm,因此我可以对基本 Form 进行子类化并更改这些属性,而无需重新定义整个 Field。)
如果您不想使用元类,可以使用@classproperty描述符(类似于)。@property
classproperty这是装饰器的简单实现
class classproperty(object):
def __init__(self, fget):
self.fget = classmethod(fget)
def __get__(self, obj, owner):
return self.fget.__get__(None, owner)()
Run Code Online (Sandbox Code Playgroud)
以及一些示例用法:
class A(object):
attr1 = 10
@classproperty
def attr2(cls):
return cls.attr1 + 10
class B(A):
attr1 = 8991
Run Code Online (Sandbox Code Playgroud)
以及它的用法:
>>> A.attr1
10
>>> A.attr2
20
>>> B.attr2
9001
>>> A().attr2
20
>>> B().attr2
9001
Run Code Online (Sandbox Code Playgroud)