为了账号安全,请及时绑定邮箱和手机立即绑定

为什么属性引用在Python继承中表现得像这样?

为什么属性引用在Python继承中表现得像这样?

陪伴而非守候 2019-12-04 10:11:58
以下内容似乎很奇怪。.基本上,somedata属性似乎在从继承的所有类之间共享the_base_class。class the_base_class:    somedata = {}    somedata['was_false_in_base'] = Falseclass subclassthing(the_base_class):    def __init__(self):            print self.somedatafirst = subclassthing(){'was_false_in_base': False}first.somedata['was_false_in_base'] = Truesecond = subclassthing(){'was_false_in_base': True}>>> del first>>> del second>>> third = subclassthing(){'was_false_in_base': True}定义self.somedata的__init__功能显然是要解决这个问题(所以每个类都有它自己的正确方法somedata字典) -但如果是这样的行为可取?
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

请注意,您看到的部分行为是由somedataa 引起的dict,而不是像a这样的简单数据类型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它被赋予了新值(object True),而在第一个示例中,由first.somedata(以及其他子类实例)引用的dict对象也被修改。


有关进一步的说明,请参见Torsten Marek对这个答案的评论。


查看完整回答
反对 回复 2019-12-04
?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

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

实际上somedata在任何时候都只有一个,因为在您的示例中,您没有分配给该名称,而是使用它来查找字典,然后为其分配一个项(键,值)。这是Python解释器如何工作的结果,一开始可能会造成混淆。


查看完整回答
反对 回复 2019-12-04
  • 3 回答
  • 0 关注
  • 387 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号