给定一个任意对象:
class Val(object):
def __init__(self):
this_val = 123
我想创建一个抽象基类,它有一个 Val() 属性:
class A(object):
foo = Val()
我希望当我的 child 继承那个类时,他们会得到 Val() 的副本。例如:
class B(A):
pass
class C(A):
pass
我希望有以下行为:
>>> b = B()
>>> c = C()
>>> c.foo.this_val = 456
>>> b.foo.this_val
123
但我得到的是:
>>> b.this_val
456
我知道我可以将 self.foo = Val() 放入 init 来实现该行为,但我有一个要求 foo 仍然是一个属性(它是 django 中的模型经理)。任何人都可以建议解决这个问题吗?
编辑:我真的需要能够访问作为类属性的值,所以我想要的行为是:
>>> C.foo.this_val = 456
>>> B.foo.this_val
123
请您参考如下方法:
属性 foo 仅 存在于 A 上。您必须使用元类向每个类添加新的 Val。
class Val(object):
def __init__(self):
self.this_val = 123
class MC(type):
def __init__(self, name, bases, d):
super(MC, self).__init__(name, bases, d)
self.foo = Val()
class A(object):
__metaclass__ = MC
class B(A):
pass
B.foo.this_val = 456
print A.foo.this_val
print B.foo.this_val
