2011-12-07 12 views
6
class ClassA: pass 
mytype = type(ClassA) 

Utilizando mytype, ¿cómo se crea una instancia de ClassA?Crear una instancia, ya tengo el tipo

Tenga en cuenta que estoy NO buscando esto como mi respuesta :)

instance = ClassA() 

Sé que en este ejemplo, eso es todo lo que necesita hacer, pero supongamos que tiene este tipo (mytype) , usted no sabe nada al respecto, y necesita crear una instancia de este.

Intenté simplemente llamar a mytype() y devuelve un error que indica que type() toma 1 o 3 argumentos. Imagino que estos argumentos pueden estar relacionados con cualquier argumento que quiera pasar al método init del objeto que se está creando.

Nota: He visto una serie de preguntas sobre cómo crear un objeto dado una cadena que representa su nombre completo. Tenga en cuenta que aquí, ya tengo un tipo, ¿es un poco diferente? ¿Creo?

EDITAR ... Yo tenía la esperanza de que podía hacer el equivalente del siguiente código .Net:

class A {} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Type type = typeof(A); 

     // Given the type, I can create a new instance 
     object new_instance = Activator.CreateInstance(type); 
    } 
} 

había asumido que en Python, el tipo (claseA) dio algo a cambio que podría utilizar más tarde para crear una instancia de ClassA. Parece que he entendido mal el tipo en Python.

+1

mytype = tipo (claseA) le dará un objeto de clase. Sospecho que esto no es lo que querías decir. –

+0

Es lo que quise decir, creo :) Consulte mi edición anterior con el ejemplo .Net si eso ayuda a aclarar algo. –

Respuesta

14

Si utiliza una nueva clase de estilo, esto va a funcionar:

class ClassA(object): 
    pass 

o = ClassA() 
mytype = type(o) 
new_object = mytype() 
+0

Esto es bastante parecido a lo que estaba buscando. ¡Gracias! –

+1

... Pero aparentemente no, si tienes parámetros en '__init __()' – Basic

4

Esta pregunta no tiene sentido. type(X) le dice el tipo de X, y el valor de retorno no contiene información sobre la clase específica X, de la misma manera type("abc"), que es str, no contiene información sobre la cadena utilizada como argumento.

A menos que la clase X tenga una metaclase personalizada, la respuesta siempre será type, ya que esa es la metaclase predeterminada en python. En su caso, entonces, mytype is type, es decir, son el mismo objeto.

Puede utilizar type para comprobar el tipo de un objeto si se utiliza un argumento, o el uso de tres argumentos puede crear una clase dinámica ,:

myclass = type('ClassB', (object,), {"class_attribute": 3.14}) 

Asumamos por un momento que mytype trabajó como usted pensé que sería. Recuerde que una instancia de un tipo es una clase, exactamente de la misma manera que una instancia de una clase es un objeto. Por lo tanto, de la misma forma que (excepto para las clases singleton) ClassA() is not ClassA() (cada instancia es única), mytype() is not mytype() - es decir, debe obtener una clase diferente cada vez que cree una instancia del tipo. Entonces, de todos modos, no obtendría ClassA. Para ilustrar este punto con el código que se puede ejecutar:

>>> type('A', (object,), {}) == type('A', (object,), {}) 
False 

OP Editar respuesta:

de clases en Python son "ciudadanos de primera clase", a diferencia de lo que tiene en mayoría de lenguajes compilados.Esto significa que puede pasar la clase directamente; que no es necesario un equivalente typeof:

>>> class A(object): pass 
... 
>>> B = A 
>>> B() 
<__main__.A object at 0xb781138c> 
>>> def print_class_name(cls): 
...  print cls.__name__ 
... 
>>> print_class_name(B) 
A 

This artículo contiene una excelente explicación de cómo type, y object instancias de objetos están conectados en pitón.

+0

Gracias, leyendo el artículo en este momento. –

3

Es lazyr dice, no es posible con type. Tal vez lo que se podría utilizar es algo así como

class ClassA: pass 
myclass = ClassA 
instance = myclass() 
Cuestiones relacionadas