首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python类中检测变量的更改

如何在Python类中检测变量的更改
EN

Stack Overflow用户
提问于 2017-10-23 19:15:39
回答 2查看 1.1K关注 0票数 1

我对Python类不是很熟悉,但我需要检测给定类的实例变量的变化。根据文档,真正的“私有”实例变量并不存在,所以我特别想在实例变量被直接访问而不是通过特定方法访问时检测更改。例如:

代码语言:javascript
复制
    class myclass:
       def __init__(self):
           self.var1 = []

       def addelement(self, data):
           self.var1.append(data)
           print('element',data,'added')

    a=myclass()
    a.addelement(6)

    "element 6 added"
    print(a.var1)
    [6]

    a.var1.append(7)
    a.var1
    [6, 7]

在后一种情况下,我不知道如何检测添加的数据。我现在知道方法可以被覆盖,但我想知道是否有一种通用的方法来检测更改,而不管变量的性质是什么(dict,list,string...)。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2017-10-23 19:24:59

最接近你想要的东西就是property。尝试运行:

代码语言:javascript
复制
#!/usr/bin/python3

class bla:
    @property 
    def myfield(self):
        return self._myhiddenfield
    @myfield.setter
    def myfield(self, somethingelse):
        print('Oh no! The enemy changed my field!')
        self._myhiddenfield = somethingelse

bla().myfield = 3

myfield的行为就像一个字段,无论何时设置,都会在屏幕上警告您。你当然可以做任何你想做的事情。如果愿意,您可以决定不接触隐藏字段。

请注意,如果敌人(不知道为什么你有一个)仍然访问_myhiddenfield,你就完了。在Python语言中,_*名称是一种常见的做法,用来暗示“不要搞乱这个”(谢谢@chepner),但在Python语言中,并没有强制执行隐私,所以这是你最好的选择。我想你可以再混淆一些。

为了完成这幅图,您还可以定义一个getter --在字段被读取时发出警告。

在我的示例中,myfield是一个属性。你应该搜索一下@符号,它是一个装饰器,还有setter和getter。

最后一点注意事项。在您的示例中,您不是要更改myclass,而是要更改列表,并使用append而不是直接设置字段。在这种情况下,您必须覆盖append并创建自己的列表,因为没有接触到内部变量(就您所关心的而言)。据我所知,没有办法检测到这一点--它甚至绕过了Python的可变性定义(在某种意义上)。

票数 2
EN

Stack Overflow用户

发布于 2017-10-23 19:25:30

在你的类上使用__setattr__ and __delattr__

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

https://stackoverflow.com/questions/46888033

复制
相关文章

相似问题

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