Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2018 20:20:45

dredsss
Зарегистрирован: 2018-10-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование 3

Можно ли у родительского класса отнаследовать приватный метод или приватную переменную?

 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'
Есть предложения (только не сеттеры и геттеры, эти явины штучки)? Для теоритических знаний только )

Отредактировано dredsss (Окт. 27, 2018 20:21:04)

Офлайн

#2 Окт. 27, 2018 20:47:19

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Наследование 3

Она наследуется. Её вызвать нельзя, но это не значит, что она куда-то девается в дочернем классе

Офлайн

#3 Окт. 27, 2018 20:58:04

dredsss
Зарегистрирован: 2018-10-23
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование 3

Papa_Svin
Она наследуется. Её вызвать нельзя, но это не значит, что она куда-то девается в дочернем классе
Причем тут вызвать, это - переменная. А на кой она мне нужна и на кой интерпретатору тратить напросто память на переменные, к которым у класса доступа нет и никак они на него не влияют.

Офлайн

#4 Окт. 27, 2018 22:21:16

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Наследование 3

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 без переопределения переменных родителей. Такое, управление именами не позволяет вам случайно вызвать эти переменные/методы.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Окт. 27, 2018 23:24:09)

Офлайн

#5 Окт. 28, 2018 08:42:46

Papa_Svin
Зарегистрирован: 2018-09-17
Сообщения: 138
Репутация: +  1  -
Профиль   Отправить e-mail  

Наследование 3

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()

Отредактировано Papa_Svin (Окт. 28, 2018 08:43:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version