Форум сайта python.su
0
Снова вопрос возник:
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
Офлайн
52
В Яндекс собрались? :)
>>> 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'
Офлайн
173
fata1ex, что это?
A().__init__()
vaultПотому что name mangling для того и задуман, чтобы случайно не переопределить атрибут в наследованном классе.
Почему здесь getvalue возвращает _A__value, а не _B__value? Без подчеркивания, разумеется, все в порядке.
Офлайн
0
fata1ex
В Яндекс собрались?
fata1ex
oops
Офлайн
0
reclosedev, спасибо. Я читал про это в учебничке одном, но там было написано, что это просто имитация приватных аттрибутов для фанатов строгой инкапсуляции. Теперь все снова логично 
Офлайн
173
vaultВ данном случае старый/новый не имеет значения.
Но если брать классы старого стиля
vaultПоделитесь ссылкой, пожалуйста.
В яндексовских вот эта в ступор ввела
reclosedev
Теперь все снова логично

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