2011-07-12 17 views
33

Me enfrento a un problema de pitón. Quiero usar type() para averiguar qué tipo de variable estoy usando. El código es similar a este:¿Por qué `type (myField)` devuelve `<type 'instance'>` y no `<type 'Field'>`?

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() 

Editar: myField() es una clase I definida.

Cuando pido el tipo() me sale: <type 'instance'> Ahora bien, según 1 esto se debe al hecho de que yo uso un elemento de clase y pido type() en eso. Ahora lo que necesito es: <type 'int'> para el ejemplo: myField(42) y <type 'str'> para myField(foo). ¿Cómo podría lograr eso?

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

El código se toma de scapy y trato de adaptarlo.

+1

'tipo()' de qué? su pregunta es confusa y ambigua. –

+2

¿Qué es 'myField'? – interjay

+0

Hacer esto debería funcionar, pero debe incluir más detalles. ¿Qué son 'myField' y' foo' y 'bar'? ¿Dónde están inicializados? Simplemente llenar una lista con enteros y cadenas y luego llamar a 'type' en sus elementos debería funcionar. –

Respuesta

0

Está colocando instancias myField en una matriz. Es por eso que el tipo es instancia. Si desea obtener el tipo int o str, necesitará acceder a ese campo en su instancia de myField.

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

seré tu myField y deberías poder acceder al int o str con un descriptor de acceso.

79

en python 2, todas sus clases deben heredar de object. Si no lo hace, terminará con "clases de estilo antiguo", que siempre son del tipo classobj, y cuyas instancias siempre son del tipo instance.

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

Si es necesario comprobar el tipo de una clase de estilo antiguo, puede utilizar su atributo __class__, o mejor aún, utilizar isinstance():

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

... Pero usted quiere saber el tipo del argumento pasado a su constructor de clase? bueno, eso está un poco fuera de las manos de Python. Tendrás que saber exactamente qué hace tu clase con sus argumentos.

+0

hola, gracias por su ayuda. Sí, quiero averiguar si el contenido de la matriz es de cadena o int. No ayuda en mi caso saber que es una "instancia". – Steve

+1

bueno, ¿qué hace 'myField .__ init __()' con sus argumentos? ¿Lo guarda en un atributo? ¿Llama a alguna otra función con ese argumento? No tenemos suficiente información para responder esa pregunta en este momento. – SingleNegationElimination

+0

'def __init __ (self, nombre, por defecto, fmt = "H"): self.name = nombre si FMT [0] en "@ = <>!": self.fmt = fmt otra cosa: auto .fmt = "!" + fmt self.default = self.any2i (Ninguno, predeterminado) self.sz = struct.calcsize (self.fmt) self.owners = [] 'Sry, no creo que yo puede formatearlo aquí:/El código es de scapy y no de mí. Solo trato de adaptarlo a mi necesidad – Steve

Cuestiones relacionadas