class A(object):
def __get(self):
pass
def _m(self):
return self.__get()
class B(A):
def _m(self):
return str(self.__get())
print(A()._m())
print(B()._m())
Why print(A()._m())
wydruków None
, ale print(B()._m())
podnosi AttributeError: 'B' object has no attribute '_B__get'
?Pokój podkreślenia w Pythonie
Pomyślałem, że podwójne podkreślenie zapobiega przesłonięciu metody.
UPDATE
Piszesz, że __get
jest prywatny.
Dlaczego więc działa następująca funkcja?
class A(object):
def __get(self):
pass
def _m(self):
return self.__get()
class B(A):
pass
print(A()._m())
print(B()._m())
Dlaczego ten kod nie budzi AttributeError
i wydruki None
dwa razy?
[Naznaczanie nazwami] (https://docs.python.org/3/tutorial/classes.html#private-variables). Twoje wołanie do 'self .__ get()' w 'B' naprawdę nazywa' self._B__get() ', które nie istnieje. Jeśli nie chcesz tego zachowania, nie używaj wiodących podwójnych podkreśleń. – kindall
Sprawdź [co oznacza znaczenie pojedynczego i podwójnego podkreślenia przed nazwą obiektu] (https://stackoverflow.com/questions/1301346/what-is-the-meaning-of-a-single-and-a -double-underscore-before-an-object-name? rq = 1) i niektóre z powiązanych pytań, ponieważ istnieją pewne szczegółowe wyjaśnienia. – JGreenwell
Ponowna aktualizacja: Ponieważ wywołujesz __get z metody zdefiniowanej w klasie A. Jest to całkowicie legalne w każdym języku, który obsługuje pojęcie prywatne - w rzeczywistości jest to najczęściej używany przypadek metod prywatnych. –