2011-12-07 12 views
6

Używając mytype, jak utworzyć instancję klasy ClassA?Utwórz instancję, ja już mam typ

Zauważ, że jestem NIE patrząc na to jako moją odpowiedź :)

instance = ClassA() 

Wiem, że w tym przykładzie, że to wszystko, co trzeba zrobić, ale załóżmy, że masz tego typu (MyType) , nie wiesz nic na ten temat i musisz utworzyć jego instancję.

Próbowałem po prostu wywołując mytype() i zwraca błąd stwierdzający, że type() ma 1 lub 3 argumenty. Wyobrażam sobie, że te argumenty mogą być związane z dowolnymi argumentami, które chciałbyś przekazać do metody init tworzonego obiektu.

Uwaga: Widziałem wiele pytań dotyczących sposobu tworzenia obiektu, podając ciąg reprezentujący jego pełną nazwę. Zauważ, że tutaj już mam typ, więc jest trochę inny? Myślę?

EDIT ... Miałem nadzieję, że mogę zrobić odpowiednik następującego kodu .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); 
    } 
} 

przypuszczałem, że w Pythonie, typ (ClassA) dał coś od siebie, że mogę później wykorzystać aby utworzyć instancję klasy ClassA. Wygląda na to, że źle zrozumiałem typ w python.

+1

MyType = typ (ClassA) daje obiektu klasy. Podejrzewam, że nie to miałeś na myśli. –

+0

Chodzi o to, co miałem na myśli, myślę :) Zobacz moją edycję powyżej z przykładem .Net, jeśli to pomaga wyjaśnić wszystko. –

Odpowiedz

14

Jeśli używasz nowej klasy styl go, to będzie działać:

class ClassA(object): 
    pass 

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

To jest bardzo blisko tego, czego szukałem. Dzięki! –

+1

... Ale najwyraźniej nie, jeśli masz parametry w '__init __()' – Basic

4

To pytanie nie ma sensu. type(X) informuje o typie X, a wartość zwracana nie zawiera informacji o spesific class X, w ten sam sposób, co type("abc"), który jest str, nie zawiera informacji o łańcuchu używanym jako argument.

Jeśli klasa X nie ma niestandardowej metaklasy, odpowiedź zawsze będzie type, ponieważ jest to domyślna metaklasa w pythonie. W twoim przypadku to mytype is type, czyli to ten sam obiekt.

Można użyć type aby sprawdzić typ obiektu, jeśli używasz jednego argumentu, lub stosując trzy argumenty można utworzyć klasę dynamicznie ,:

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

Załóżmy przez chwilę, że mytype pracował jak ty myślałem, że tak. Pamiętaj, że instancją typu jest klasa, dokładnie w ten sam sposób, w jaki instancja klasy jest obiektem. Tak więc w ten sam sposób (z wyjątkiem pojedynczych klas) ClassA() is not ClassA() (każde wystąpienie jest unikalne), mytype() is not mytype() - tj. Za każdym razem, gdy tworzysz typ, powinieneś otrzymać inną klasę. Więc i tak nie otrzymasz z powrotem ClassA. Aby zilustrować ten punkt z kodem można uruchomić:

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

OP EDIT ODPOWIEDŹ:

Zajęcia w Pythonie są „obywatele First Class”, w przeciwieństwie do tego, co masz w większości zebranych językach.Oznacza to, że możesz bezpośrednio przekazać klasę; nie trzeba się typeof równowartość:

>>> 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 artykuł zawiera doskonałe wyjaśnienie, w jaki type, object i przedmiot przypadki są połączone w Pythonie.

+0

Dzięki, czytając artykuł już teraz. –

3

Jest lazyr mówi, nie jest to możliwe z type. Może to, co można użyć coś jak

class ClassA: pass 
myclass = ClassA 
instance = myclass() 
Powiązane problemy