是否可以创建父类成员的全新实例?

时间:2011-12-18 22:01:22

标签: python python-2.7

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

编辑第三个我现在意识到我不可能要求翻译。一旦我将一个类的实例分配给一个成员,那么继承的类就无法知道如何创建该类的新实例。因此,对于我的问题,似乎元类是唯一的解决方案。

1 个答案:

答案 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)