我遇到了一个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。