首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么属性引用在Python继承中的行为是这样的?

为什么属性引用在Python继承中的行为是这样的?
EN

Stack Overflow用户
提问于 2008-10-15 22:18:00
回答 2查看 8.3K关注 0票数 22

下面的内容看起来很奇怪。基本上,从the_base_class继承的所有类似乎都共享somedata属性。

class the_base_class:
    somedata = {}
    somedata['was_false_in_base'] = False


class subclassthing(the_base_class):
    def __init__(self):
            print self.somedata


first = subclassthing()
{'was_false_in_base': False}
first.somedata['was_false_in_base'] = True
second = subclassthing()
{'was_false_in_base': True}
>>> del first
>>> del second
>>> third = subclassthing()
{'was_false_in_base': True}

__init__函数中定义self.somedata显然是解决这个问题的正确方法(所以每个类都有自己的somedata字典)--但是什么时候需要这样的行为呢?

EN

回答 2

Stack Overflow用户

发布于 2008-10-15 22:40:10

请注意,您看到的行为的一部分原因是somedata是一个dict,而不是一个简单的数据类型,比如bool

例如,看看这个不同的示例,它的行为不同(尽管非常相似):

class the_base_class:
    somedata = False

class subclassthing(the_base_class):
    def __init__(self):
        print self.somedata


>>> first = subclassthing()
False
>>> first.somedata = True
>>> print first.somedata
True
>>> second = subclassthing()
False
>>> print first.somedata
True
>>> del first
>>> del second
>>> third = subclassthing()
False

此示例与问题中给出的示例行为不同的原因是,这里first.somedata被赋予了一个新值(对象True),而在第一个示例中,由first.somedata (以及其他子类实例)引用的dict对象正在被修改。

请参阅Torsten Marek对此答案的评论以进一步澄清。

票数 12
EN

Stack Overflow用户

发布于 2008-10-15 22:55:23

我认为理解这一点的最简单方法(以便您可以预测行为)是认识到您的somedata是类的属性,而不是该类的实例(如果您这样定义它的话)。

在任何时候,实际上只有一个somedata,因为在您的示例中,您没有为该名称赋值,而是使用它来查找字典,然后为其赋值。这是一个陷阱,这是python解释器工作方式的结果,一开始可能会让人感到困惑。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/206734

复制
相关文章

相似问题

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