我目前正在为Scapy的Packet
类编写一个子类,该类在使用带有setter的属性时会提供奇怪的行为。
此外,该问题仅在Python 3中发生,而在Python 2中不发生。
更具体地说,从来没有调用我的属性设置器(在Python 3中),而且我不明白为什么会这样。
请查看以下代码段:
import logging
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)
from scapy.all import Packet
class IH(Packet):
pass
def getter(self):
print("GETTER")
def setter(self, value):
print("SETTER")
prop = property(fget=getter, fset=setter)
setattr(IH, "x", prop)
def main():
p = IH()
p.x
p.x = 1
if __name__ == "__main__":
main()
对于Python 2,输出如下:
$ python test.py
GETTER
SETTER
这正是我所期望的。
但是,在Python 3中,输出看起来像这样:
$ python3 test.py
GETTER
=>永远不会调用二传手。
我想这与我要从其继承子类的Scapy的Packet
类有关,因为当我从对象继承子类时一切正常。
据我了解,如果我写
p.x = 1
,则应翻译为
setter(p, 1)
,对吧?
非常感谢您的帮助!