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

Utilizzo di mytype, come si crea un'istanza di ClassA?Creare un'istanza, ho già il tipo

Nota che sono NON alla ricerca di questo come la mia risposta :)

instance = ClassA() 

So che in questo esempio, questo è tutto quello che dovete fare, ma supponiamo che avete questo tipo (MyType) , non ne sai nulla e devi creare un'istanza di esso.

Ho provato a chiamare mytype() e restituisce un errore affermando che type() accetta 1 o 3 argomenti. Immagino che questi argomenti possano essere correlati a qualunque argomento tu voglia passare nel metodo init dell'oggetto che si sta creando.

Nota: ho ricevuto una serie di domande su come creare un oggetto con una stringa che rappresenta il nome completo. Nota che qui, ho già un tipo quindi è un po 'diverso? Credo?

EDIT ... speravo che avrei potuto fare l'equivalente del seguente codice .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); 
    } 
} 

ho dato per scontato che in Python, tipo (ClassA) ha dato qualcosa di nuovo che ho potuto poi utilizzare per creare un'istanza di ClassA. Sembra che abbia frainteso il tipo in python.

+1

mytype = tipo (ClassA) vi darà un oggetto di classe. Sospetto che non sia quello che intendevi. –

+0

È quello che intendevo, penso :) Vedi la mia modifica sopra con l'esempio .Net se questo aiuta a chiarire qualsiasi cosa. –

risposta

14

Se si utilizza una nuova classe di stile, questa funzionerà:

class ClassA(object): 
    pass 

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

Questo è abbastanza vicino a quello che stavo cercando. Grazie! –

+1

... Ma apparentemente non se hai parametri in '__init __()' – Basic

4

Questa domanda non ha senso. type(X) indica il tipo di X e il valore restituito non contiene informazioni sulla classe spesific X, nello stesso modo type("abc"), che è str, non contiene informazioni sulla stringa utilizzata come argomento.

A meno che la classe X non abbia un metaclasse personalizzato, la risposta sarà sempre type, poiché questo è il metaclasse predefinito in python. Nel tuo caso quindi, mytype is type, cioè, sono lo stesso oggetto.

È possibile utilizzare type per verificare il tipo di un oggetto, se si utilizza un argomento, o utilizzando tre argomenti è possibile creare una classe in modo dinamico ,:

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

Supponiamo per un momento che mytype lavorato come voi pensavo che sarebbe Ricorda che un'istanza di un tipo è una classe, esattamente nello stesso modo in cui un'istanza di una classe è un oggetto. Quindi, nello stesso modo in cui (eccetto per le classi singleton) ClassA() is not ClassA() (ogni istanza è univoca), mytype() is not mytype() - ad esempio, si dovrebbe ottenere una classe diversa ogni volta che si crea un'istanza del tipo. Quindi non ti restituirei lo ClassA. Per illustrare questo punto con il codice è possibile eseguire:

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

OP Modifica risposta:

classi in Python sono "cittadini di prima classe", a differenza di quello che hai in più lingue compilati.Ciò significa che puoi passare la classe direttamente; non hai bisogno di un typeof equivalente:

>>> 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 articolo contiene un'eccellente spiegazione di come type, object e istanze di oggetti sono collegati in pitone.

+0

Grazie, leggendo l'articolo in questo momento. –

3

Is lazyr dice, non è possibile con type. Forse quello che si potrebbe usare è qualcosa di simile

class ClassA: pass 
myclass = ClassA 
instance = myclass() 
Problemi correlati