为什么`type(myField)`返回`<type'instage'=“”>`而不是`<type'field'=“”>`?</type> </type>

时间:2011-07-12 15:33:57

标签: python

我遇到了一个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 '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,我尝试调整它。

2 个答案:

答案 0 :(得分:87)

在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

但是......你想知道传递给类构造函数的参数的类型吗?嗯,这有点脱离了蟒蛇的手。你必须知道你的课对它的论点做了什么。

答案 1 :(得分:0)

您正在将myField实例放入数组中。这就是为什么类型是实例。如果您想获取int或str类型,则需要访问myField实例中的该字段。

def returnArr(self):
   for i in self.array:
       print type(i.accessor)

我将成为你的myField,你应该可以使用访问器访问int或str。