Как стать автором
Обновить

Комментарии 20

Вау. Давно статей такого уровня по питону небыло на хабре. Welcome!
«Спасибо за ваше время»
Спасибо за ваши знания — которыми делитесь.
+ линк на Python Data Model.

А ещё было бы очень интересно узнать о изменениях в протоколе атрибутов в Python 3 в сравнении с Python 2.6

Спасибо за полезный линк. Насколько я знаю, в python3 протокол атрибутов практически не изменился по сравнению с 2.6. По крайней мере вся информация в этой статье будет актуальна для new-style objects в 2.6. Примеры на python3 — робкая попытка внести небольшой вклад в его популизацию.
>>Экземпляр некоторого класса A — это объект, у которого в атрибуте __bases__ есть ссылка на класс A.

С этой фразой не согласен, или я чего-то не понимаю.
Если у объекта в __bases__ ссылка на класс А — то это класс-наследник класса А

Экземпляр класса А хранит ссылку на класс А в атрибуте __class__
Верно, мой косяк. Спасибо за замечание! Поправил статью.
Очень крутая статья, надо будет ее еще раз перечитать попозже. Хочется отметить отличное заключение автора, потому что python достаточно прост и понятен, а подобные «усложняющие» плюшки ни сколько не сказываются на доступности и красоте языка.
И ни слова про mro!?
Статья, на мой взгляд, и так разрослась сверх меры. А mro довольно крупная тема, которую я планировал рассмотреть отдельно (вместе с super(), множественным наследованием, и, возможно, метаклассами).
Надо было просто упомянуть )
да, пожалуй, упомянуть действительно стоило
Интересно! Спасибо за статью.
Да, прекрасная статья! Вот бы её года четыре назад… :-)
Повторение — мать учения! Спасибо!
property може работать как декоратор, и тогда он определяет дескриптор не-данных.
class Foo(object):
    @property
    def getter_only(self):
        pass
Не могу с вами согласиться. Если развить этот пример:
Foo.__dict__["getter_only"].__get__  # <method-wrapper '__get__' of property object at 0x21dd5d0>
Foo.__dict__["getter_only"].__set__  # <method-wrapper '__set__' of property object at 0x21dd5d0>
f = Foo()
f.getter_only = 1                                  # AttributeError 

если бы getter_only был дескриптором не данных, значение записалось бы в __dict__ экземпляра
И property, и classmethod, и staticmethod могут быть декораторами. Честно говоря, всегда применял их как декораторы…
"""«Чтобы установить значение value атрибута attrname экземпляра a»""
А я вот как-то натыкался на ситуацию, когда установка атрибута приводила к AttributeError.

В голову сходу приходят три сценария, которые могли бы к этому привести:
1. Использование __slots__ может привести к такой ошибке, при попытке установить атрибут с именем, не перечисленным в __slots__
2. Использование __setattr__, в нём явный raise AttributeError()
3. Использование дескриптора данных, с raise AttributeError() в методе __set__

возможно, есть ещё варианты
Ну да, и вариант выше комментом.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.