为啥 `type(myField)` 返回 `<type 'instance'>` 而不是 `<type 'Field'>`?
Posted
技术标签:
【中文标题】为啥 `type(myField)` 返回 `<type \'instance\'>` 而不是 `<type \'Field\'>`?【英文标题】:Why does `type(myField)` return `<type 'instance'>` and not `<type 'Field'>`?为什么 `type(myField)` 返回 `<type 'instance'>` 而不是 `<type 'Field'>`? 【发布时间】:2011-10-03 18:09:33 【问题描述】:我遇到了一个 python 问题。我想使用type()
找出我正在使用的变量类型。代码与此类似:
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()
编辑:myField() 是我定义的一个类。
当我请求 type() 时,我得到:<type 'instance'>
现在根据 1,这是因为我使用了一个类元素并在上面请求 type()
。现在我需要的是:<type 'int'>
例如:myField(42)
和 <type 'str'>
为myField(foo)
。我怎样才能做到这一点?
编辑:
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
和 foo
和 bar
是什么?它们在哪里初始化?只需用整数和字符串填充一个列表,然后在其元素上调用 type
即可。
请告诉我们myField
是如何定义的。你能否解释一下为什么myField(foo)
中的foo
应该是一个字符串?你真的是说"foo"
吗?
@Mr. Shickadance,你是对的,它应该有效,而且确实有效。我在 REPL 中使用我自己定义的类 myField
、foo
和 bar
对此进行了测试,它给出了预期的结果。史蒂夫没有告诉我们一些相关的事情。
对于不清楚的帖子,我编辑了帖子。我希望现在应该更清楚了。
【参考方案1】:
在 python 2 中,你所有的类都应该继承自 object
。如果你不这样做,你最终会得到“旧样式类”,它们的类型总是classobj
,并且它的实例总是类型instance
。
>>> class myField():
... pass
...
>>> class yourField(object):
... pass
...
>>> m = myField()
>>> y = yourField()
>>> type(m)
<type 'instance'>
>>> type(y)
<class '__main__.yourField'>
>>>
如果你需要检查一个老式类的类型,你可以使用它的__class__
属性,或者更好的是,使用isinstance()
:
>>> m.__class__
<class __main__.myField at 0xb9cef0>
>>> m.__class__ == myField
True
>>> isinstance(m, myField)
True
但是...您想知道传递给您的类构造函数的 参数 的类型吗?好吧,这有点超出了python的掌控。你必须知道你的班级对它的论点做了什么。
【讨论】:
嗨,谢谢您的帮助。是的,我想知道数组的内容是字符串还是整数,在我的情况下,知道这是一个“实例”并没有帮助。 好吧,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 = []
对不起,我不认为我可以在这里格式化它:/ 代码来自 scapy 而不是我。我只是尝试根据我的需要调整它
@Steve 将它添加到您可以在哪里正确格式化它的问题。只需编辑和扩展您那里的内容。
正如我所说,在您的 pastebin 帖子中链接的类将三个参数传递给它的构造函数。 BitField(foo)
无效,因为您必须提供三个参数(名称、默认值和大小),但在上面的代码中,您只提供一个。【参考方案2】:
您正在将 myField 实例放入一个数组中。这就是类型是实例的原因。如果您想获取 int 或 str 类型,则需要访问 myField 实例中的该字段。
def returnArr(self):
for i in self.array:
print type(i.accessor)
然后我将成为您的 myField,您应该能够使用访问器访问 int 或 str。
【讨论】:
以上是关于为啥 `type(myField)` 返回 `<type 'instance'>` 而不是 `<type 'Field'>`?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Type.GetFields() 不返回基类中的支持字段?
BeautifulSoup nth-of-type 返回空列表。 Soup.select()[n -1] 返回元素。为啥?