是否可以使用自己的__init__()
函数构造自己的图层?
我试图做到的方式是:
>>> class SomePacket(Packet):
... def __init__(self, number):
... fields_desc = [IntField("Number",number)]
...
>>> packet = SomePacket(1)
>>> ls(packet)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 1213, in ls
if not isinstance(obj.payload, NoPayload):
File "/usr/lib/python2.7/dist-packages/scapy/packet.py", line 180, in __getattr__
raise AttributeError(attr)
AttributeError: payload
那样做有什么问题,我该如何编写类以使其与一种构造函数一起使用?
最佳答案
天空是极限,您可以按自己喜欢的方式扩展或滥用船舷。因此,是的,有可能拥有自己的__init__
,但是您将不得不重新实现一些简单的代码,或者至少调用超类以适合接口。另外,您还必须将fields_desc
定义为类/实例var而不是__init__
本地var(即将代码更改为self.fields_desc
以使其成为实例var或显式使其成为类var)。
但是,如果您只是尝试为图层字段分配值,则最好不要重新发明轮子,并使用scapy设计它的方式,因为它已经提供了类似__init__
的界面。
class SomePacket(Packet):
fields_desc = [IntField("Number",1), # capital letters are not convenient
IntField("yournumber",1),]
packet = SomePacket(Number=1, yournumber=99)
packet.show()
导致:
###[ SomePacket ]###
Number = 1
yournumber= 99
我唯一必须覆盖
__init__
的层是SSL / TLS层,该层为跨越多个层(用于解密等)的ssl上下文(加密/密钥)提供了一个隐藏字段。关于python - Scapy:从具有自己的init的Packet派生的层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31336714/