Python 是否可以创建父类成员的全新实例?
Python版本2.7 场景Python 是否可以创建父类成员的全新实例?,python,python-2.7,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 我想知道的是,除了让\uu init\uuu中的所有类成员定义有类B的实例有自己的x副本,而不必在类B中重新定义它们之外,还有什么方法吗? 也许是一些type()技巧 还没有找到任何东西,但我会继续寻找,我想这里是找到答案的最佳地方。 非
class A(object):
x = 0
class B(A):
pass
ai = A()
bi = B()
#Then:
id(ai.x) == id(bi.x)
>>> True
我想知道的是,除了让\uu init\uuu
中的所有类成员定义有类B
的实例有自己的x
副本,而不必在类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
现在出现的问题是,由于我没有在class B
中重新分配x
,即使class Y
的实例的成员发生变化,它们都指向同一个class Y
实例
如果你熟悉Django的话,我几乎是在重现它们的表单是如何工作的。我没有决定在表单中使用元类
,然后在每次创建新实例时建立字段字典,也许我需要切换到使用元类
编辑第三个我现在意识到我要求翻译是不可能的。一旦我将一个类的实例分配给一个成员,继承的类就无法知道如何创建该类的新实例。因此,对于我的问题来说,元类似乎是唯一的解决方案。对于您的示例,它与不可变对象无关<代码>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
True
False
另外请注意,即使在\uuuu init\uuuu
中初始化x
,由于实现定义的行为,可以缓存和重用不可变对象,并且实例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):