2012-08-24 19 views
5

Chciałbym automatycznie uruchamiać kod podczas tworzenia klasy, który może wywoływać inne metody klasy. Nie znalazłem sposobu, aby to zrobić z samej deklaracji klasy i ostatecznie utworzyłem @classmethod o nazwiei wywołałem ją z zakresu definicji zaraz po deklaracji klasy. Czy istnieje metoda, którą mogę zdefiniować w taki sposób, że zostanie automatycznie wywołana po utworzeniu obiektu klasy?Wywołanie metody klasy po utworzeniu klas Pythona

+2

Tworzenie klas lub tworzenie instancji? Ponieważ oba można zrobić, ale odpowiedź jest różna w zależności. –

+1

Możesz użyć metaclasses do tego. Zobacz na przykład [to pytanie] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python). – BrenBarn

+6

Na marginesie: proszę nie wymyślać '__special_methods__'. Jest to zarezerwowane dla języka Python. Użyj '_jednostki_rezydentów_prefiksu', jeśli chcesz, aby była prywatna. – delnan

Odpowiedz

10

Możesz to zrobić, używając metaclass lub class decorator.

Klasa dekorator (od 2.6) jest prawdopodobnie łatwiejsze do zrozumienia:

def call_clsinit(cls): 
    cls._clsinit() 
    return cls 

@call_clsinit 
class MyClass: 
    @classmethod 
    def _clsinit(cls): 
     print "MyClass._clsinit()" 

metaclasses są bardziej skuteczne; mogą wywoływać kod i modyfikować składniki klasy przed jej utworzeniem, jak również później (również mogą być dziedziczone):

def call_clsinit(*args, **kwargs): 
    cls = type(*args, **kwargs) 
    cls._clsinit() 
    return cls; 

class MyClass(object): 
    __metaclass__ = call_clsinit 

    @classmethod 
    def _clsinit(cls): 
     print "MyClass._clsinit()" 
+2

Dodałbym, że przynajmniej z tekstu pytania trudno jest stwierdzić, dlaczego "__new__" lub "__init__" nie dają sobie rady. –

Powiązane problemy