如何在Python类中检测变量的变化

时间:2017-10-23 11:15:39

标签: python variables

我对Python类并不熟悉,但我需要检测给定类的实例变量的变化。根据文件,真正的"私人"实例变量不存在,因此我特别希望在不通过特定方法直接访问实例变量时检测更改。例如:

    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 ...)。谢谢。

2 个答案:

答案 0 :(得分:2)

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

#!/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是一个属性。你应该谷歌那个,@符号作为装饰者,以及设置者和吸气剂。

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

答案 1 :(得分:1)

在课堂上使用__setattr__ and __delattr__