我对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 ...)。谢谢。
答案 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__
。