Kiedy mam zwykłe metody wywoływania innej metody w klasie, muszę to zrobić
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ę pisać
self.dosomethingelse()
ponieważ nie ma instancji. Jak mam zrobić w Pythonie, aby wywołać metodę statyczną z innej metody statycznej tej samej klasy?
Edycja: co za bałagan. Ok, zredagowałem pytanie do pierwotnego pytania. Mam już odpowiedź na drugie pytanie w komentarzu Petera Hansena. Jeśli uważasz, że powinienem otworzyć inne pytanie, aby uzyskać odpowiedź, którą już mam, proszę, powiedz mi.
python
static-methods
Pablo
źródło
źródło
Odpowiedzi:
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()
źródło
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()
źródło
Test.static_method_to_call()
powinno działać również z innych niestatycznych i nieklasowych metod tej klasy, prawda? (... i prawdopodobnie inne zajęcia?)Test.static_method_to_call()
będzie działać z dowolnego miejsca.UWAGA - wygląda na to, że pytanie trochę się zmieniło. Odpowiedź na pytanie, jak wywołać metodę instancji z metody statycznej, jest taka, że nie można tego zrobić bez przekazania instancji jako argumentu lub bez utworzenia jej instancji wewnątrz metody statycznej.
Poniżej znajduje się głównie odpowiedź na pytanie „jak wywołać metodę statyczną z innej metody statycznej”:
Należy pamiętać, że jest różnica między metody statyczne i metody klasy w Pythonie. Metoda statyczna nie przyjmuje niejawnego pierwszego argumentu, podczas gdy metoda klasowa przyjmuje klasę jako niejawny pierwszy argument (zwykle
cls
zgodnie z konwencją). Mając to na uwadze, oto jak możesz to zrobić:Jeśli jest to metoda statyczna:
Jeśli jest to metoda klasowa:
źródło
cls.dosomethingelse()
z definicji klasy.cls.dosomethingelse()
z poziomu samej metody klasy. Tak jak możesz używać tylkoself
z poziomu samej metody instancji.OK, główna różnica między metodami klasowymi a metodami statycznymi to:
źródło
MyClass.class_method()
z dowolnego miejscaMyClass
(może myślałeś o „metodach instancji”?)Jeśli nie zależą one od klasy lub instancji, dlaczego nie uczynić ich po prostu funkcją? Ponieważ wydaje się to oczywistym rozwiązaniem. O ile oczywiście nie myślisz, że będzie to wymagało nadpisania, podklasy itp. Jeśli tak, to poprzednie odpowiedzi są najlepszym rozwiązaniem. Trzymam kciuki Nie zostanę skrytykowany za oferowanie jedynie alternatywnego rozwiązania, które może, ale nie musi odpowiadać czyimś potrzebom;).
Ponieważ prawidłowa odpowiedź będzie zależała od przypadku użycia danego kodu;) Enjoy
źródło
nie możesz wywoływać metod niestatycznych z metod statycznych, ale tworząc instancję wewnątrz metody statycznej ... powinno to tak działać
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()
mam nadzieję, że ci to pomoże :)
źródło
@classmethod
zadeklarowanie metod i użyciecls.dosomethingelse()
wewnątrzcls.dosomething()
- gorsze zarówno pod względem wydajności (tworzenie instancji obiektów tylko po to, aby uzyskać dostęp do metody statycznej), jak i czytelności (nie jest to proste i wyobrażam sobie, wzorca stał się szablonem, cała podstawa kodu może stać się dość trudna do przeanalizowania dla zwykłego człowieka)