我对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...)。谢谢。
发布于 2017-10-23 19:24:59
最接近你想要的东西就是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 = 3myfield的行为就像一个字段,无论何时设置,都会在屏幕上警告您。你当然可以做任何你想做的事情。如果愿意,您可以决定不接触隐藏字段。
请注意,如果敌人(不知道为什么你有一个)仍然访问_myhiddenfield,你就完了。在Python语言中,_*名称是一种常见的做法,用来暗示“不要搞乱这个”(谢谢@chepner),但在Python语言中,并没有强制执行隐私,所以这是你最好的选择。我想你可以再混淆一些。
为了完成这幅图,您还可以定义一个getter --在字段被读取时发出警告。
在我的示例中,myfield是一个属性。你应该搜索一下@符号,它是一个装饰器,还有setter和getter。
最后一点注意事项。在您的示例中,您不是要更改myclass,而是要更改列表,并使用append而不是直接设置字段。在这种情况下,您必须覆盖append并创建自己的列表,因为没有接触到内部变量(就您所关心的而言)。据我所知,没有办法检测到这一点--它甚至绕过了Python的可变性定义(在某种意义上)。
发布于 2017-10-23 19:25:30
在你的类上使用__setattr__ and __delattr__。
https://stackoverflow.com/questions/46888033
复制相似问题