Dalsze powtórzenie rady Mike'a i Alexa i dodanie własnego koloru ...
Używanie atrybutów instancji jest typowym ... bardziej idiomatycznym Pythonem. Atrybuty klas nie są używane tak często, ponieważ ich przypadki użycia są specyficzne. To samo dotyczy metod statycznych i klasowych oraz metod „normalnych”. Są to specjalne konstrukcje odnoszące się do konkretnych przypadków użycia, w przeciwnym razie jest to kod stworzony przez anormalnego programistę, który chce się pochwalić, że zna jakiś niejasny zakątek programowania w Pythonie.
Alex wspomina w swojej odpowiedzi, że dostęp będzie (trochę) szybszy dzięki o jeden mniejszy poziom wyszukiwania ... pozwólcie, że wyjaśnię dalej tym, którzy nie wiedzą jeszcze, jak to działa. Jest bardzo podobny do dostępu zmiennego, którego kolejność wyszukiwania jest następująca:
- miejscowi
- nielokalne
- globalne
- wbudowane
W przypadku dostępu do atrybutów kolejność jest następująca:
- instancja
- klasa
- klasy bazowe określone przez MRO (kolejność rozwiązywania metod)
Obie techniki działają w sposób „na lewą stronę”, co oznacza, że najpierw sprawdzane są najbardziej lokalne obiekty, a następnie sprawdzane są warstwy zewnętrzne.
W powyższym przykładzie załóżmy, że szukasz path
atrybutu. Gdy napotka odniesienie takie jak „ self.path
”, Python najpierw sprawdzi atrybuty instancji w celu dopasowania. Gdy to się nie powiedzie, sprawdza klasę, z której utworzono obiekt. Na koniec przeszuka klasy bazowe. Jak stwierdził Alex, jeśli twój atrybut zostanie znaleziony w instancji, nie musi szukać gdzie indziej, stąd oszczędność czasu.
Jeśli jednak nalegasz na atrybuty klas, potrzebujesz tego dodatkowego wyszukiwania. Lub inną alternatywą jest odwoływanie się do obiektu za pośrednictwem klasy zamiast instancji, np. MyController.path
Zamiast self.path
. To jest bezpośrednie wyszukiwanie, które obejdzie odroczone wyszukiwanie, ale jak Alex wspomina poniżej, jest to zmienna globalna, więc tracisz ten bit, który myślałeś, że zamierzasz zapisać (chyba że utworzysz lokalne odniesienie do [globalnej] nazwy klasy ).
Najważniejsze jest to, że przez większość czasu powinieneś używać atrybutów instancji. Będą jednak sytuacje, w których atrybut klasy będzie odpowiednim narzędziem do tego zadania. Kod używający obu w tym samym czasie będzie wymagał największej staranności, ponieważ użycie self
zapewni ci dostęp tylko do obiektu atrybutu instancji i cienia do atrybutu klasy o tej samej nazwie. W takim przypadku musisz użyć access atrybutu przez nazwę klasy, aby się do niego odwołać.