Scapy 设置类属性的问题
我正在使用scapy,并且有一个与scapy和python相关的问题。我尝试用变量来作为scapy的字段名称。下面是我尝试做的代码片段(但它没有成功):
class Test(Packet):
name = "Test23"
def __init__(self,foo=None):
self.foo=foo
fields_desc = [
BitField(self.foo, 0x0, 4),
BitField("bar", 0x3, 4)
]
现在我想问题可能出在fields_desc是一个类属性,而不是类变量。那么,我该如何实现我想要的呢?(在运行时或类初始化时设置self.foo的名称?)
我非常感谢任何帮助。 祝好
编辑:加一个计数器就足够了。我尝试过:
class Counter:
count = 0
def __init__(self):
self.__class__.count += 1
foo = [
"lala"+str(count)
]
print foo
a=Counter()
a.count
print a.foo
b=Counter()
b.count
print b.foo
但似乎不行。如果你能给我指个正确的方向就太好了,我有点迷茫。
2 个回答
1
我猜你想做的是根据你用'getfield'解析的原始数据来改变第一个BitField的名字?这有点难判断……
不过,从函数 pre_dissect
来看,你可以查看原始数据,并根据需要将字段添加到self.fields_desc中。使用pre_dissect时,确保在函数结束时返回未修改的原始数据包。
根据我的经验,这种做法很少是正确的,通常使用ConditionalField和类重载在长远来看效果会更好。
祝你好运
1
我认为类的属性是在类的构造函数运行之前就被初始化了,所以在创建fields_desc的时候,self.foo还没有被赋值。你可以试着把fields_desc声明为一个空数组,然后在你的__init__
函数里面把BitField对象添加到这个数组里。
我不太清楚你继承的Packet类是怎么工作的,但你可能也想看看这个super()函数。
编辑:也许你在寻找这样的东西?
class Counter:
i = 0
foo = []
def count(self):
self.__class__.i += 1
self.__class__.foo.append(['lala' + str(self.__class__.i)])
a = Counter()
a.count()
print Counter().foo
b = Counter()
b.count()
print Counter().foo
输出
[['lala1']]
[['lala1'], ['lala2']]
关于类变量的更多信息可以在这里找到