Comments 29
>С предыдущего ответа сразу возникает вопрос — что значит для дескрипторов?
Завис.
Завис.
Тут можно было и без дескрипторов обойтись.
>>> import types
>>> a.add_x = types.MethodType(add_x, a)
>>> import types
>>> a.add_x = types.MethodType(add_x, a)
Я так и не понял что такое дескриптор, может имело смысл хотябы простое определение дать?
В самом начале этой статьи есть ссылка на статью-перевод. Попробуйте заглянуть туда.
Простое определение на самом деле ничего не обьяснит.
Если хотите — дескриптор это обьект, для которого определен хотя б один из методов "__get__", "__set__", "__del__".
Если хотите — дескриптор это обьект, для которого определен хотя б один из методов "__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) 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__ методе дескриптора, ну и так далее.
> тест на понимание работы @property
Этот тест скорее на понимание того, что Bar является объектом Foo и поэтому в Bar доступны все классовые переменные из Foo, а не только property.
Этот тест скорее на понимание того, что Bar является объектом Foo и поэтому в Bar доступны все классовые переменные из Foo, а не только property.
Кстати, есть забавная задачка, связанная с дескрипторами:
>>> 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() нельзя добавлять новые атрибуты.
>>> 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
Где-то так…
<class '__main__.Object'>
>>> hasattr(Object(), '__dict__')
True
>>> type(object())
<type 'object'>
>>> hasattr(object(), '__dict__')
False
Где-то так…
Встроенные типы даних реализованы не на Пайтоне, поэтому нет возможности динамически добавлять атрибуты.
Интересно, сработает ли «object().foo = 1» в PyPy?
Интересно, сработает ли «object().foo = 1» в PyPy?
> Встроенные типы даних реализованы не на Пайтоне, поэтому нет возможности динамически добавлять атрибуты.
Возможность теоретическая есть, но этого не стали делать из соображений производительности. Встроенные классы — это полноценные классы в питоне. Т.е. я тоже могу создать класс без __dict__ и который будет себя вести также, как object.
Возможность теоретическая есть, но этого не стали делать из соображений производительности. Встроенные классы — это полноценные классы в питоне. Т.е. я тоже могу создать класс без __dict__ и который будет себя вести также, как object.
ага, а откуда он появился? Мы ведь в Object ничего не писали и не добавляли, просто наследовали.
Про low-level python можете еще что-нибудь для расширения кругозора порекомендовать читать? Кроме docs.python.org, там конечно все есть, но это справочник и надо знать, что ищешь.
На Хабре есть хорошый топик — как раз ответ на Ваш вопрос: habrahabr.ru/blogs/python/84235/
> Кроме docs.python.org, там конечно все есть, но это справочник и надо знать, что ищешь.
Основное про классы и модель данных, тут:
docs.python.org/reference/datamodel.html#
Основное про классы и модель данных, тут:
docs.python.org/reference/datamodel.html#
Sign up to leave a comment.
Еще немного о дескрипторах в Python