Почему `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 с помощью аксессора.