为啥 `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() 时,我得到:&lt;type 'instance'&gt; 现在根据 1,这是因为我使用了一个类元素并在上面请求 type()。现在我需要的是:&lt;type 'int'&gt; 例如:myField(42)&lt;type 'str'&gt;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() 是什么?您的问题既不清楚又模棱两可。 这样做应该可行,但您需要包含更多细节。 myFieldfoobar 是什么?它们在哪里初始化?只需用整数和字符串填充一个列表,然后在其元素上调用 type 即可。 请告诉我们myField是如何定义的。你能否解释一下为什么myField(foo) 中的foo 应该是一个字符串?你真的是说"foo"吗? @Mr. Shickadance,你是对的,它应该有效,而且确实有效。我在 REPL 中使用我自己定义的类 myFieldfoobar 对此进行了测试,它给出了预期的结果。史蒂夫没有告诉我们一些相关的事情。 对于不清楚的帖子,我编辑了帖子。我希望现在应该更清楚了。 【参考方案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 "@=&lt;&gt;!": 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] 返回元素。为啥?

在 Solr 中搜索日期范围或空/无字段 [重复]

为啥 dict(k=4, z=2).update(dict(l=1)) 在 Python 中返回 None?

如果 typeof(Xyz) 存在,为啥 System.Type.GetType("Xyz") 返回 null?