Why does `type(myField)` return `<type 'instance'>` and not `<type 'Field'>`?

I am confronted to a python problem. I want to use type() to find out what type of variable I am using. The code looks similar to this one:

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() is a class I defined.

When I ask for the type() I get: <type 'instance'> Now according to 1 this is due to the fact that I use a class element and ask for type() on that. Now what I need is: <type 'int'> for the example: myField(42) and <type 'str'> for myField(foo) . How could I acheive that?

EDIT:

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 = []

The code is taken from scapy and I try to adapt it.


in python 2, all of your classes should inherit from object . If you don't, you end up with "old style classes", which are always of type classobj , and whose instances are always of type instance .

>>> class myField():
...     pass
... 
>>> class yourField(object):
...     pass
... 
>>> m = myField()
>>> y = yourField()
>>> type(m)
<type 'instance'>
>>> type(y)
<class '__main__.yourField'>
>>> 

If you need to check the type of an old-style class, you can use its __class__ attribute, or even better, use isinstance() :

>>> m.__class__
<class __main__.myField at 0xb9cef0>
>>> m.__class__ == myField
True
>>> isinstance(m, myField)
True

But... you want to know the type of the argument passed to your class constructor? well, that's a bit out of python's hands. You'll have to know just what your class does with it's arguments.


You are placing myField instances into an array. That is why the type is instance. If you would like to get the int or str type you will need to access that field in your myField instance.

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

i will then be your myField and you should be able to access the int or str with an accessor.

链接地址: http://www.djcxy.com/p/6996.html

上一篇: 用于搜索的RESTful URL设计

下一篇: 为什么`type(myField)`返回`<type'instance'>`而不是'<type'Field'>`?