我遇到了一个python问题。我想使用type()来找出我使用的变量类型。代码看起来像这样:
1 2 3 4 5 6 7 8 9
   | class Foo(): 
       array=[ myField(23),myField(42),myField("foo"), myField("bar")] 
       def returnArr(self): 
          for i in self.array: 
               print type(i) 
 
if __name__ =="__main__": 
    a=Foo() 
    a.returnArr()  | 
 
Edit: myField()是我定义的一个类。
当我请求类型()时,我得到:现在根据1,这是由于我使用了一个类元素,并在上面请求type()。现在我需要的是:用于示例:myField(42)和用于myField(foo)。我怎么能受得了呢?
编辑:
1 2 3 4 5 6 7 8 9
   | def __init__(self, name, default, fmt="H"): 
    self.name = name 
    if fmt[0] in"@=<>!": 
        self.fmt = fmt 
    else: 
        self.fmt ="!"+fmt 
    self.default = self.any2i(None,default) 
    self.sz = struct.calcsize(self.fmt) 
    self.owners = []  | 
 
代码取自scapy,我试图对其进行调整。
		
		
- type() ?你的问题既不清楚又模棱两可。
 
- myField是什么?
 
- 这样做应该有效,但是您需要包含更多的细节。什么是myField和foo和bar?它们在哪里初始化?只需用int和字符串填充一个列表,然后对它的元素调用type就可以了。
 
- 请告诉我们myField是如何定义的。你能解释一下为什么myField(foo)中的foo应该是字符串吗?你是说"foo"吗?
 
- @Mr。嘘,你是对的,它应该有用,它确实有用。我在REPL中使用自己对类myField、foo和bar的定义测试了这一点,并给出了预期的结果。有一些相关的事情史蒂夫没有告诉我们。
 
- sry对于不清楚的帖子,我进行了编辑。我希望现在应该更清楚了。
 
- 需要说明的是,我的输出是,这正是我所期望的。
 
 
	  
 
在python2中,所有的类都应该继承自object。如果不这样做,就会得到"旧式类",它们总是类型为classobj,并且它们的实例总是类型为instance。
1 2 3 4 5 6 7 8 9 10 11 12 13
   | >>> class myField(): 
...     pass 
...  
>>> class yourField(object): 
...     pass 
...  
>>> m = myField() 
>>> y = yourField() 
>>> type(m) 
<type 'instance'> 
>>> type(y) 
<class '__main__.yourField'> 
>>>  | 
 
如果需要检查旧式类的类型,可以使用它的__class__属性,或者更好的方法是使用isinstance():
1 2 3 4 5 6
   | >>> m.__class__ 
<class __main__.myField at 0xb9cef0> 
>>> m.__class__ == myField 
True 
>>> isinstance(m, myField) 
True  | 
 
但是…您想知道传递给类构造函数的参数的类型吗?这有点超出了python的能力范围。你必须知道你的类是如何处理它的参数的。
		
		
- 你好,谢谢你的帮助。是的,我想知道数组的内容是字符串还是int,在我的例子中,知道它是一个"实例"是没有帮助的。
 
- 那么,myField.__init__()对它的参数做了什么?它是否保存在属性中?它会用那个参数调用其他函数吗?我们现在没有足够的信息来回答这个问题。
 
- def __init__(self, name, default, fmt="H"):         self.name = name         if fmt[0] in"@=<>!":             self.fmt = fmt          else:             self.fmt ="!"+fmt         self.default = self.any2i(None,default)         self.sz = struct.calcsize(self.fmt)         self.owners = [] Sry,我认为我不能在这里格式化它:/代码来自scapy而不是我。我只是试着让它适应我的需要
 
- @Steve将它添加到您的问题中,您可以在哪里正确格式化它。只需要编辑和扩展这里的内容。
 
- 我编辑了原帖
 
- @steve,你原来问的那个myField和那个def __init__是一样的吗?我不确定;这个函数需要两个参数(除了self),但是只使用一个参数调用它。你还有什么可以分享的吗?
 
- pastebin.com/dzyNU2N1我把我使用的scapy代码放在这里。如果您想测试代码,只需将myField替换为BitField。我希望这次我包括了所有你需要的信息,和sry为非常糟糕的帖子,我下次会做得更好。
 
- 正如我所说,在您的pastebin post中链接的类接受三个参数到它的构造函数。BitField(foo)是无效的,因为您必须提供三个参数(名称、默认值和大小),但是在上面的代码中,您只提供一个参数。
 
- 好了,真的。让我们换个说法,我完全迷路了。因此,我粘贴在这里的代码应该可以工作:pastebin.com/jjcXyJcQ(我在开始时导入scapy,但只使用上一篇文章中的文件)如何获得字段foo的值0x0的 ?我想如果我能理解这是怎么做的,我就能自己解决剩下的问题了。
 
- 看起来*Field类型完全确定了它包装的数据类型。不幸的是,库似乎使用旧式类。您可以尝试创建自己版本的库,并修复从object继承的基类,然后对它进行测试,看看它是否破坏了任何东西(很可能不会),然后type(array[0]) == BitField或其他类似的类将为您提供类型。做得更多实际上是一个"scapy"问题,而不是"python"问题,您应该编辑您的问题,以反映您需要帮助的特定库。
 
- 好的,谢谢。这似乎行得通,但我仍然有一个问题(我认为这与python有关,而不是scapy)。我有:现在,但我不知道如何返回该字段的第二个值的类型,我想检查一个位字段的第二个元素是否为NoneType。有什么提示吗?索引不起作用:/
 
- 你应该就你的肩胛问题问一个新问题。很抱歉我不能帮你。
 
 
	  
将myField实例放入数组中。这就是为什么类型是instance。如果希望获得int或str类型,则需要访问myField实例中的该字段。
1 2 3
   | def returnArr(self): 
   for i in self.array: 
       print type(i.accessor)  | 
 
然后我将是您的myField,您应该能够使用访问器访问int或str。