Найти - Пользователи
Полная версия: Наследование 3
Начало » Python для новичков » Наследование 3
1
dredsss
Можно ли у родительского класса отнаследовать приватный метод или приватную переменную?
 class A:
    __var = "secret variable"
class C(A):
    def try1(self): print(super().__var)  # 'super' object has no attribute '_C__a'
    def try2(self): print(self.__var)  # 'C' object has no attribute '_C__a'
    def try3(self): print(self._A__var)  # 'C' object has no attribute '_A__var'
Есть предложения (только не сеттеры и геттеры, эти явины штучки)? Для теоритических знаний только )
Papa_Svin
Она наследуется. Её вызвать нельзя, но это не значит, что она куда-то девается в дочернем классе
dredsss
Papa_Svin
Она наследуется. Её вызвать нельзя, но это не значит, что она куда-то девается в дочернем классе
Причем тут вызвать, это - переменная. А на кой она мне нужна и на кой интерпретатору тратить напросто память на переменные, к которым у класса доступа нет и никак они на него не влияют.
PEHDOM
dredsss
на кой интерпретатору тратить напросто память на переменные, к которым у класса доступа нет и никак они на него не влияют.
ну начнем с того что память он и не тратит, почитайте чтоле как работают классы и наследование в пайтоне. Когда вы создаете класс наследник, он не тянет в себя все что было у родителя. Он просто хранит ссылку на родителя, и если чегото у себя не находит спрашивает у родителя. Поэтому память не тратиться.
dredsss
это - переменная. А на кой она мне нужна
Откуда же нам знать. Вы странный, сначала создали private переменную, а потом жалуетесь что не можете к ней получить доступ “извне”. Так устроен пайтон что переменные начинающиеся с “__” кагбе считаються private. Это если совсем по простому. На самомо деле двойное подчеркивание “__” не означает “private” по аналогии с С++ или Java, это скорее псевдопривантые переменные. Вы используете их для определения переменных, которые являются “локальными по классу”.
Вы всеравно можете к ним оратиться если знаетет имя класса.
Например изменив ваш код, я получу значение переменной.

 ...
class C(A):
    def try2(self):
        print(A._A__var)
        print(C._A__var)
c = C()
c.try2()
>>> 
secret variable
secret variable
>>> 
ХЗ почему у вас try3 не отрабатывает, должно все выводить.
А.__var автоматически преобразуеться в А._A__var в классе A. В классе С он превращаеться в С._С__var(но только если вы решите там ее обьявить ). Поэтому каждый подкласс может определять свою собственную переменную __var без переопределения переменных родителей. Такое, управление именами не позволяет вам случайно вызвать эти переменные/методы.

Papa_Svin
dredsss
А на кой она мне нужна и на кой интерпретатору тратить напросто память на переменные, к которым у класса доступа нет и никак они на него не влияют.
Ну как это не влияют!!!


  
class Foo:
	def __init__(self):
		self.__value = 25
	def get_value(self):
		return self.__value
class Bar(Foo):
	def __init__(self):
		super().__init__()
		self.__value = 12
	def print(self):
		print(self.get_value() + self.__value)
b = Bar()
b.print()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB