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

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

>С предыдущего ответа сразу возникает вопрос — что значит для дескрипторов?

Завис.
Пофиксав. Возможно теперь немного понятней.
В конце статьи: >>> P.S. Русский — не родной язык, замечания прошу в личку.

Статья полезная, а потому граждане! Будьте добры!
Тут можно было и без дескрипторов обойтись.

>>> import types
>>> a.add_x = types.MethodType(add_x, a)
Да, можно. Идея в том, что б показать, как это работает.
Я так и не понял что такое дескриптор, может имело смысл хотябы простое определение дать?
В самом начале этой статьи есть ссылка на статью-перевод. Попробуйте заглянуть туда.
Простое определение на самом деле ничего не обьяснит.

Если хотите — дескриптор это обьект, для которого определен хотя б один из методов "__get__", "__set__", "__del__".
Дескриптор — это интерфейс атрибута объекта или класса. Т.е. инстанс дескриптора — это атрибут, для которого можно определить операции:

1) getattr и тогда вызывается метод __get__,
2) установки атрибут (setattr)
3) и удаления атрбиута(delattr)

class Descriptor(object):
def __get__(*args, **kw):

def __set__(*args, **kw):


class Foo(object):
x = Descriptor()
y = 1

foo = Foo()
Что будет происходить при вызове foo.x определяется в __get__ методе дескриптора, ну и так далее.
Да понял. Спасибо. именно то что мне нужно для текущего проекта: я уж думал кучу ифов городить, а так прекрасно на стадии сборки класса нужную стратегию подключить.

Автору: 1 абзац, а на понимание статьи очень сильно влияет.
НЛО прилетело и опубликовало эту надпись здесь
> тест на понимание работы @property

Этот тест скорее на понимание того, что Bar является объектом Foo и поэтому в Bar доступны все классовые переменные из Foo, а не только property.
НЛО прилетело и опубликовало эту надпись здесь
>>> Bar().baz

Я полагаю будет эксепшн, поскольку атрибуты метакласса доступны только классу, но не инстансу класса :)
Кстати, есть забавная задачка, связанная с дескрипторами:

>>> x = object()
>>> x.foo = 1
Traceback (most recent call last):
File "", line 1, in AttributeError: 'object' object has no attribute 'foo'
>>> class Object(object): pass

>>> y = Object()
>>> y.foo = 1
>>> y.foo
1
>>>

почему так, ведь мы только наследовали класс, но при этом, ничего не добавляли и меняли. Ну и почему в x=object() нельзя добавлять новые атрибуты.
>>> type(Object())
<class '__main__.Object'>
>>> hasattr(Object(), '__dict__')
True
>>> type(object())
<type 'object'>
>>> hasattr(object(), '__dict__')
False

Где-то так…
НЛО прилетело и опубликовало эту надпись здесь
object() == object.__call__()

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

Интересно, сработает ли «object().foo = 1» в PyPy?
> Встроенные типы даних реализованы не на Пайтоне, поэтому нет возможности динамически добавлять атрибуты.

Возможность теоретическая есть, но этого не стали делать из соображений производительности. Встроенные классы — это полноценные классы в питоне. Т.е. я тоже могу создать класс без __dict__ и который будет себя вести также, как object.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
>>> class A(object):
… __slots__ = []

>>> a = A()
>>> a.x = 1
Traceback (most recent call last):
File "", line 1, in AttributeError: 'A' object has no attribute 'x'
>>> hasattr(A(), '__dict__')
False
>>>
ага, а откуда он появился? Мы ведь в Object ничего не писали и не добавляли, просто наследовали.
НЛО прилетело и опубликовало эту надпись здесь
Про low-level python можете еще что-нибудь для расширения кругозора порекомендовать читать? Кроме docs.python.org, там конечно все есть, но это справочник и надо знать, что ищешь.
На Хабре есть хорошый топик — как раз ответ на Ваш вопрос: habrahabr.ru/blogs/python/84235/
> Кроме docs.python.org, там конечно все есть, но это справочник и надо знать, что ищешь.

Основное про классы и модель данных, тут:

docs.python.org/reference/datamodel.html#
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории