2010-07-08 15 views
7

Jestem nowy w Pythonie i podczas testowania niektórych metod na moim obiekcie zauważyłem coś "dziwnego".Python: czy wywołanie metody "bezpośrednio" tworzy instancję obiektu?

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    def say(self, s): 
     print s 

def main(): 
    Ape().say('eeek') 

if __name__ == '__main__': 
    main() 

Napisałem ten mały przykład, aby zilustrować, gdzie się pomyliłem. Jeśli zrobisz Ape(). Say ('eeek'), czy to faktycznie tworzy instancję obiektu Ape i uruchamia metodę init? Myślałem, że to nie będzie, ale miałem jakieś dziwne efekty uboczne, więc teraz myślę, że to robi?

Odpowiedz

10

Tak jest. To właśnie robi Ape(): tworzy nowy obiekt Ape i jako część tego procesu zostaje uruchomiona metoda .

W tym przykładzie należy wywołać metodę say tego obiektu. Zauważ, że nie byłoby sposobu, aby zadzwonić pod numer say, jeśli nie masz obiektu Ape.

+0

Dzięki że czyści rzeczy. Domyślam się, że Ape() zbiera się od razu, skoro nigdzie nie ma o tym odniesienia? – Pickels

+1

@Pickels: od razu staje się niedostępny, więc może być natychmiast zbiorem śmieci, tak. Lub może pozostać w pustce próżnej niedostępnej pamięci, dopóki interpreter Pythona nie zdecyduje, że chce odzyskać przestrzeń ;-) –

3

Tak. Ape() tworzy instancję klasy Ape, chociaż ponieważ nie ma przydziału, nie jest z nią związana żadna etykieta. W tym momencie wywoływana jest jego funkcja __init__. Następnie wywoływana jest funkcja say.

Żeby było jasne:

Ape().say('eeek') 

odpowiada:

(Ape()).say('eeek') 

Który bardziej wyraźnie wskazuje, co dzieje się w pierwszej kolejności.

12

Jeśli chcesz wywołać metodę bezpośrednio, bez tworzenia instancji, możesz użyć dekoratora staticmethod. Zauważ, że nie ma self podczas korzystania z metody statycznej

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    @staticmethod 
    def say(s): 
     print s 

def main(): 
    Ape.say('eeek') 

if __name__ == '__main__': 
    main() 

porównać z metod klasy, gdzie klasa jest pierwszym parametrem zamiast instancją

class Ape(object): 
    def __init__(self): 
     print 'ooook' 

    @classmethod 
    def say(cls, s): 
     print "the class is:", cls 
     print s 

def main(): 
    Ape.say('eeek') 

if __name__ == '__main__': 
    main() 
+0

Dzięki, naprawdę doceniam dodatkowe informacje, które otrzymałeś. – Pickels

+0

Część informacji o klasach była niezwykle przydatna dzięki. Należy jednak pamiętać, że metoda init nie jest uruchamiana, ponieważ nie jest tworzona instancja. – ThinkBonobo

Powiązane problemy