Почему `type (myField)` return `<type 'instance'>`, а не `<type 'Field'>`?

Я столкнулся с проблемой 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). Как я мог добиться этого?

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

Код берется из scapy, и я пытаюсь его адаптировать.

Ответ 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

Но... вы хотите узнать тип аргумента, переданный вашему конструктору класса? хорошо, что немного из рук питона. Вам нужно будет знать, что делает ваш класс с аргументами.

Ответ 2

Вы помещаете экземпляры myField в массив. Вот почему тип является экземпляром. Если вы хотите получить тип int или str, вам нужно будет получить доступ к этому полю в вашем экземпляре myField.

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

i будет вашим myField, и вы сможете получить доступ к int или str с помощью аксессора.