class Example(object):
def the_example(self):
itsProblem = "problem"
theExample = Example()
print(theExample.itsProblem)
Jak uzyskać dostęp do zmiennej klasy? Próbowałem dodać tę definicję:
def return_itsProblem(self):
return itsProblem
Ale to też zawodzi.
Odpowiedzi:
Odpowiedź w kilku słowach
W twoim przykładzie
itsProblem
jest zmienną lokalną.Musisz użyć
self
do ustawiania i pobierania zmiennych instancji. Możesz to ustawić w__init__
metodzie. Wtedy twój kod wyglądałby tak:class Example(object): def __init__(self): self.itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
Ale jeśli chcesz prawdziwej zmiennej klasy, użyj bezpośrednio nazwy klasy:
class Example(object): itsProblem = "problem" theExample = Example() print(theExample.itsProblem) print (Example.itsProblem)
Ale uważaj na tę zmienną , ponieważ
theExample.itsProblem
jest automatycznie ustawiana na równąExample.itsProblem
, ale nie jest wcale tą samą zmienną i może być zmieniana niezależnie.Kilka wyjaśnień
W Pythonie zmienne można tworzyć dynamicznie. Dlatego możesz wykonać następujące czynności:
class Example(object): pass Example.itsProblem = "problem" e = Example() e.itsSecondProblem = "problem" print Example.itsProblem == e.itsSecondProblem
wydruki
Dlatego właśnie to robisz w poprzednich przykładach.
Rzeczywiście, w Pythonie używamy
self
asthis
, ale to trochę więcej.self
jest pierwszym argumentem dowolnej metody obiektu, ponieważ pierwszy argument jest zawsze odwołaniem do obiektu. Jest to automatyczne, czy tak nazywasz,self
czy nie.Co oznacza, że możesz:
class Example(object): def __init__(self): self.itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
lub:
class Example(object): def __init__(my_super_self): my_super_self.itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
To jest dokładnie to samo. Pierwszym argumentem metody obiektowej ANY jest obiekt bieżący, nazywamy to
self
tylko konwencją. Dodajesz tylko zmienną do tego obiektu, tak samo jak robisz to z zewnątrz.A teraz o zmiennych klasowych.
Kiedy robisz:
class Example(object): itsProblem = "problem" theExample = Example() print(theExample.itsProblem)
Zauważysz, że najpierw ustawiliśmy zmienną klasy , a następnie uzyskujemy dostęp do zmiennej obiektu (instancji) . Nigdy nie ustawiliśmy tej zmiennej obiektu, ale działa, jak to możliwe?
Cóż, Python próbuje najpierw pobrać zmienną obiektu, ale jeśli nie może jej znaleźć, poda zmienną klasy. Ostrzeżenie: zmienna klasy jest wspólna dla instancji, a zmienna obiektu nie.
Podsumowując, nigdy nie używaj zmiennych klas do ustawiania domyślnych wartości zmiennych obiektowych. Użyj
__init__
do tego.W końcu dowiesz się, że klasy Pythona są instancjami, a zatem same obiektami, co daje nowy wgląd w zrozumienie powyższego. Wróć i przeczytaj to ponownie później, kiedy już to zrozumiesz.
źródło
theExample.itsProblem
jest automatycznie ustawiana na równąExample.itsProblem
, ale z praktycznego punktu widzenia * nie jest wcale tą samą zmienną i można ją zmienić niezależnie. *: właściwie zaczyna się od tego samego obiektu, ale bardzo łatwo jest przypadkowo zmienić to, jeśli nie rozumiesz powiązania nazwDeklarujesz zmienną lokalną, a nie zmienną klasową. Aby ustawić zmienną instancji (atrybut), użyj
class Example(object): def the_example(self): self.itsProblem = "problem" # <-- remember the 'self.' theExample = Example() theExample.the_example() print(theExample.itsProblem)
Aby ustawić zmienną klasy (znaną również jako element statyczny), użyj
class Example(object): def the_example(self): Example.itsProblem = "problem" # or, type(self).itsProblem = "problem" # depending what you want to do when the class is derived.
źródło
Jeśli masz funkcję instancji (tj. Taką, która jest przekazywana self), możesz użyć self, aby uzyskać referencję do klasy za pomocą
self.__class__
Na przykład w poniższym kodzie tornado tworzy instancję do obsługi żądań get, ale możemy przejąć
get_handler
klasę i użyć jej do przechowywania klienta riak, więc nie musimy tworzyć go dla każdego żądania.import tornado.web import riak class get_handler(tornado.web.requestHandler): riak_client = None def post(self): cls = self.__class__ if cls.riak_client is None: cls.riak_client = riak.RiakClient(pb_port=8087, protocol='pbc') # Additional code to send response to the request ...
źródło
Zaimplementuj instrukcję return, jak w przykładzie poniżej! Powinnaś być dobra. Mam nadzieję, że to komuś pomoże ...
class Example(object): def the_example(self): itsProblem = "problem" return itsProblem theExample = Example() print theExample.the_example()
źródło