2009-12-07 15 views
56

Kiedy mam regularne metody wywołanie innej metody w klasie, muszę zrobić toPython metody statyczne - jak wywołać metodę z inną metodą

class test: 
    def __init__(self): 
     pass 
    def dosomething(self): 
     print "do something" 
     self.dosomethingelse() 
    def dosomethingelse(self): 
     print "do something else" 

ale kiedy mam metody statyczne nie mogę napisz

self.dosomethingelse() 

, ponieważ nie ma żadnej instancji. Jak mam zrobić w Pythonie wywoływanie metody statycznej z innej statycznej metody tej samej klasy?

Edytuj: co za bałagan. OK, zredagowałem pytanie do pierwotnego pytania. Mam już odpowiedź na drugie pytanie, które znalazłem w komentarzu Petera Hansena. Jeśli myślisz, że powinienem otworzyć kolejne pytanie o odpowiedź, którą już mam, plz powiedz mi.

+2

@pablo: nie można zmienić istotę pytanie !! Zakończ to pytanie i zacznij ** inny **! – jldupont

+0

ok, ok. Masz na myśli usunąć pytanie? Odpowiedź jest już dostępna w komentarzu Petera Hansena: – Pablo

+0

@pablo: nie można tu usunąć, co nie byłoby grzeczne dla wszystkich, którzy przyczynili się do udzielenia odpowiedzi na twoje pytanie. Musisz zaakceptować odpowiedź ** i ** utwórz nowe pytanie. – jldupont

Odpowiedz

47

class.method powinno działać.

class SomeClass: 
    @classmethod 
    def some_class_method(cls): 
    pass 

    @staticmethod 
    def some_static_method(): 
    pass 

SomeClass.some_class_method() 
SomeClass.some_static_method() 
+11

W tym miejscu należy dodać poradę: Oczywiste jest, że metody klas nie mają wad w stosunku do metod statycznych, a metody klas pozwalają na rozszerzenie metody w przyszłości w celu wywoływania innych metod klasowych. Dlatego zawsze powinno być preferowane, nawet jeśli nie ma natychmiastowej potrzeby. – u0b34a0f6ae

+0

** UWAGA ** @pablo ** zmieniono ** pytanie !!!!! – jldupont

+1

@ u0b34a0f6ae: Nie wiem, czy robię coś dobrego, czy nie ... ale zdefiniowałem dekoratora wewnątrz klasy. Dekorator musiał być "metodą statyczną", a nie "metodą klasową". –

8

UWAGA - wygląda na to, że pytanie uległo zmianie. Odpowiedź na pytanie, w jaki sposób wywołujesz metodę instancji z metody statycznej, polega na tym, że nie możesz bez przekazania instancji jako argumentu ani instancji tej instancji wewnątrz metody statycznej.

Co następuje, jest przede wszystkim odpowiedzieć „jak można wywołać metodę statyczną z innej metody statycznej”:

pamiętać, że istnieje jest różnica między metody statyczne i metody klasy w Pythonie. Metoda statyczna nie przyjmuje niejawnego pierwszego argumentu, podczas gdy metoda klasy przyjmuje klasę jako niejawny pierwszy argument (zwykle cls według konwencji). Mając to na uwadze, oto jak można to zrobić:

Jeśli jest to metoda statyczna:

test.dosomethingelse() 

Jeśli jest to metoda klasy:

cls.dosomethingelse() 
+1

można używać tylko 'cls.dosomethingelse()' z definicji klasy. – jldupont

+1

Aby być dokładniejszym, możesz użyć tylko 'cls.dosomethingelse()' z samej metody klasy. Podobnie jak możesz używać tylko 'self' z samej metody instancji. –

+1

Przepraszam, źle napisałem pytanie. OOPS !. Chciałem napisać "Jak mam wykonać w Pythonie wywoływanie metody instancji z innej statycznej metody tej samej klasy", a nie "Jak mam robić w Pythonie wywoływanie metody statycznej z innej statycznej metody tego samego klasa " – Pablo

2

nie można wywołać metody non-statyczne z metody statyczne, ale poprzez tworzenie instancji wewnątrz metody statycznej .... powinno działać jak ten

class test2(object): 
    def __init__(self): 
     pass 

    @staticmethod 
    def dosomething(): 
     print "do something" 
     #creating an instance to be able to call dosomethingelse(),or you may use any existing instace 
     a=test2() 
     a.dosomethingelse() 

    def dosomethingelse(self): 
     print "do something else" 

test2.dosomething() 

nadzieję, że pomoże :)

+1

IMO to podejście jest znacznie gorsze niż użycie 'classmethod' do zadeklarowania twoich metod i użycie' cls.dosomethingelse() 'wewnątrz' cls.dosomething() '- gorsze pod względem wydajności (tworzenie obiektów tylko po to, aby uzyskać dostęp do metody statycznej) i czytelność (nie jest to proste, i wyobrażam sobie, że gdyby ten rodzaj wzorca stał się podstawową wersją, cały kod mógłby stać się trudny do sparsowania przez zwykłego człowieka) –

+0

Jak czytam gdzieś w SO, zamiast inicjalizować instancja bezpośrednio do wywołania metody, możesz po prostu ją nazwać - sama uruchomi się sama. – Nakilon

3

ok główny nurt między metodami klasowymi i metodami statycznymi to: metoda klasy ma swoją własną tożsamość, dlatego należy ją wywoływać z poziomu INSTANCJI. na metodzie drugiej strony statycznej mogą być dzielone między wielu przypadkach tak, że musi być wywoływana z wewnątrz klasy

69

Jak mam to zrobić w Pythonie za wywołanie statycznej metody z innej metody statycznej o tej samej klasie ?

class Test() : 
    @staticmethod 
    def static_method_to_call() 
     pass 

    @staticmethod 
    def another_static_method() : 
     Test.static_method_to_call() 

    @classmethod 
    def another_class_method(cls) : 
     cls.static_method_to_call() 
0

Jeśli te nie zależą od klasy lub instancji, to dlaczego nie tylko ich funkcja? Ponieważ wydaje się to oczywistym rozwiązaniem. Chyba że myślisz, że będzie trzeba nadpisać, podklasę itp. Jeśli tak, to poprzednie odpowiedzi są najlepszym wyborem. Trzymamy skrzyżowane palce, ale nie zostanę odcięty, ponieważ oferuję jedynie alternatywne rozwiązanie, które może lub nie musi odpowiadać potrzebom kogoś;).

Jako prawidłową odpowiedź będzie zależeć od przypadku użycia kodu w pytaniu;) Enjoy

Powiązane problemy