Python 2.7版。
方案
class A(object):
x = 0
class B(A):
pass
ai = A()
bi = B()
#Then:
id(ai.x) == id(bi.x)
>>> True
我想知道的是,除了让__init__
中的所有类成员定义让class B
的实例拥有自己的副本{{1无需在x
中重新定义它们?
也许有些class B
技巧?
Haven还没有找到任何东西,但我一直在寻找,想到这里是找到答案的最佳地点。 非常感谢任何见解。
编辑语法
edit2 要澄清,因为我没有真正使用最好的例子。
type()
现在出现的问题是,由于我没有在class Y(object):
def __init__(self):
self.z = 0
class A(object):
x = Y()
class B(A):
pass
ai = A()
bi = B()
id(ai.x) == id(bi.x)
>>> True
ai.x.z = 3
id(ai.x) == id(bi.x)
>>> True
中重新分配x
,因此即使class B
实例的成员,它们都指向class Y
的同一个实例改变。
如果您熟悉Django,我几乎可以重新创建其表单的工作方式。我没有决定使用class Y
获取表单,然后在每次创建新实例时构建字段字典,也许我需要切换到使用metaclass
。
编辑第三个我现在意识到我不可能要求翻译。一旦我将一个类的实例分配给一个成员,那么继承的类就无法知道如何创建该类的新实例。因此,对于我的问题,似乎元类是唯一的解决方案。
答案 0 :(得分:2)
对于您的示例,与不可变对象无关。如果分配了新对象,则bi
引用该对象。
class A(object):
x = 0
class B(A):
pass
ai = A()
bi = B()
print id(ai.x) == id(bi.x)
ai.x=3
print id(ai.x) == id(bi.x)
结果:
True
False
另请注意,即使您在x
中初始化__init__
,由于实现定义的行为,也可以缓存和重用不可变对象,以及实例ai
和{{1仍然共享bi
对象。
0
结果(使用CPython 2.7.2):
class A(object):
def __init__(self):
self.x = 0
class B(A):
pass
ai = A()
bi = B()
print id(ai.x) == id(bi.x)
ai.x=3
print id(ai.x) == id(bi.x)