Найти - Пользователи
Полная версия: Наследование аттрибутов, начинающихся с '_'
Начало » Python для новичков » Наследование аттрибутов, начинающихся с '_'
1 2
vault
Снова вопрос возник:

class A:
    def __init__( self ):
        self.__value = 1
    def getvalue( self ):
        return self.__value
class B( A ):
    def __init__( self ):
        A.__init__( self )
        self.__value = 2
 
b = B()
print b.getvalue()
print b._B__value

Выводит:
1
2
Почему здесь getvalue возвращает _A__value, а не _B__value? Без подчеркивания, разумеется, все в порядке.
fata1ex
В Яндекс собрались? :)

>>> class A(object):
...     def __init__(self):
...         self.__value = 1
...     def getvalue(self):
...         return self.__value
...     
>>> class B( A ):
...     def __init__( self ):
...         A().__init__()
...         self.__value = 2
... 
>>> print B().getvalue()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 5, in getvalue
AttributeError: 'B' object has no attribute '_A__value'
oops
reclosedev
fata1ex, что это?
 A().__init__()

vault
Почему здесь getvalue возвращает _A__value, а не _B__value? Без подчеркивания, разумеется, все в порядке.
Потому что name mangling для того и задуман, чтобы случайно не переопределить атрибут в наследованном классе.
vault
fata1ex
В Яндекс собрались?

В той статье задачки прорешал (спасибо, кстати, за рекомендованную статью), начал рыскать в поисках других. В яндексовских вот эта в ступор ввела, когда копать поглубже начал.

Думал насчет яндексовской стажировки, но они моему знакомому давали суровые алгоритмические задачки на допуск на собеседование, поэтому как-то стремно: он действительно гораздо более крутой алгоритмист, да и то залажал там.
Мои же попытки решения олимпиадных задач огорчают меня тем, что даже верно написанная задача с кодефорсез на питоне зачастую не влезает в их тесты по времени, а на с я писать не люблю.

fata1ex
oops

Ну, это понятно почему. Но если брать классы старого стиля, и именно мой код, то почему происходит так?
vault
reclosedev, спасибо. Я читал про это в учебничке одном, но там было написано, что это просто имитация приватных аттрибутов для фанатов строгой инкапсуляции. Теперь все снова логично
reclosedev
vault
Но если брать классы старого стиля
В данном случае старый/новый не имеет значения.

vault
В яндексовских вот эта в ступор ввела
Поделитесь ссылкой, пожалуйста.

reclosedev
Теперь все снова логично


Это кстати и в PEP-8 есть
If your class is intended to be subclassed, and you have attributes that you do not want subclasses to use, consider naming them with double leading underscores and no trailing underscores. This invokes Python's name mangling algorithm, where the name of the class is mangled into the attribute name. This helps avoid attribute name collisions should subclasses inadvertently contain attributes with the same name.


vault
reclosedev
В данном случае старый/новый не имеет значения.

Да, понял уже после вашего комментария.

Не помню, где именно видел: залил с локального комплект:
http://speedy.sh/RcAvg/py-taska.zip
vault
Кстати, именно благодаря тому что узнал здесь, на все вопросы ответил правильно сразу, но как начал смотреть глубже примеры - всплыла вот эта фигня.
fata1ex
reclosedev, это трэйсбэк ненавязчиво намекает нам, что внутри getvalue запрашивается _A__value :) Задачки в вакансиях Яндекса по питону.

http://company.yandex.ru/job/vacancies/ (ого, редизайн)
vault
Кстати, раз уж пошла такая пьянка: а в каких хороших компаниях кроме гугла, яндекса и мэйла требуются питонисты?
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