Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 27, 2012 15:23:57

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

Снова вопрос возник:

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? Без подчеркивания, разумеется, все в порядке.

Офлайн

#2 Июнь 27, 2012 16:56:09

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

В Яндекс собрались? :)

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



Офлайн

#3 Июнь 27, 2012 17:15:21

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

fata1ex, что это?

 A().__init__()

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

Офлайн

#4 Июнь 27, 2012 17:17:06

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

fata1ex
В Яндекс собрались?

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

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

fata1ex
oops

Ну, это понятно почему. Но если брать классы старого стиля, и именно мой код, то почему происходит так?

Офлайн

#5 Июнь 27, 2012 17:18:56

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

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

Офлайн

#6 Июнь 27, 2012 17:22:26

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

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.


Отредактировано reclosedev (Июнь 27, 2012 17:24:29)

Офлайн

#7 Июнь 27, 2012 17:27:59

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

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

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

Не помню, где именно видел: залил с локального комплект:
http://speedy.sh/RcAvg/py-taska.zip

Офлайн

#8 Июнь 27, 2012 17:29:45

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

Кстати, именно благодаря тому что узнал здесь, на все вопросы ответил правильно сразу, но как начал смотреть глубже примеры - всплыла вот эта фигня.

Офлайн

#9 Июнь 27, 2012 17:31:14

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

reclosedev, это трэйсбэк ненавязчиво намекает нам, что внутри getvalue запрашивается _A__value :) Задачки в вакансиях Яндекса по питону.

http://company.yandex.ru/job/vacancies/ (ого, редизайн)



Офлайн

#10 Июнь 27, 2012 17:35:18

vault
Зарегистрирован: 2012-06-21
Сообщения: 52
Репутация: +  0  -
Профиль   Отправить e-mail  

Наследование аттрибутов, начинающихся с '_'

Кстати, раз уж пошла такая пьянка: а в каких хороших компаниях кроме гугла, яндекса и мэйла требуются питонисты?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version