首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以为父类的成员创建一个全新的实例?

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

Stack Overflow用户
提问于 2011-12-18 22:01:21
回答 1查看 80关注 0票数 2

Python版本2.7。

场景

代码语言:javascript
复制
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需要澄清,因为我并没有真正使用最好的例子。

代码语言:javascript
复制
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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-18 22:15:35

对于您的示例来说,对于不可变的对象来说,这并不重要。如果指定了一个新对象,bi将引用它。

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
True
False

还要注意的是,即使在x中初始化__init__,由于实现定义的行为,不可变对象也可以缓存和重用,实例aibi仍然共享0对象。

代码语言:javascript
复制
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):

代码语言:javascript
复制
True
False
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8555167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档