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的实例有自己的x副本而不必在class B中重新定义它们之外,是否还有其他方法?也许是一些type()技巧?
还没有找到任何东西,但我会继续寻找,认为这里将是最好的地方找到答案。任何洞察力都会受到极大的赞赏。
编辑:语法
edit2需要澄清,因为我并没有真正使用最好的例子。
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的同一个实例,即使class Y实例的成员发生了更改。
如果您熟悉Django,我几乎要重新创建它们的表单。我没有决定使用表单的metaclass,然后每次创建新实例时都会构建字段字典,也许我需要切换到使用metaclass。
编辑我正在意识到的第三个,我现在要求解释器是不可能的。一旦我将类的实例分配给成员,继承的类就无法知道如何创建该类的新实例。因此,对于我的问题,似乎元类是唯一的解决办法。
发布于 2011-12-18 22:15:35
对于您的示例来说,对于不可变的对象来说,这并不重要。如果指定了一个新对象,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和bi仍然共享0对象。
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)结果( CPython 2.7.2):
True
Falsehttps://stackoverflow.com/questions/8555167
复制相似问题