Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以创建父类成员的全新实例?_Python_Python 2.7 - Fatal编程技术网

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

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()技巧 还没有找到任何东西,但我会继续寻找,我想这里是找到答案的最佳地方。 非

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()
技巧

还没有找到任何东西,但我会继续寻找,我想这里是找到答案的最佳地方。 非常感谢您的任何见解

编辑:语法

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):