从Scapy的Packet进行子类化时,为什么不调用我的Python属性设置器

时间:2019-02-17 15:25:20

标签: python python-3.x properties scapy

我目前正在为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)

,对吧?

非常感谢您的帮助!

0 个答案:

没有答案