само по себе могло бы быть нулевым. (Ничто из этого не должно быть важно для вас, если вам не нужно работать с C API.)
type.__setattr__
льзуется для классов, в основном экземпляров метаклассов.object.__setattr__
с другой стороны, используется для экземпляров классов. Это полностью понято.
Я не вижу существенной разницы между этими двумя методами, по крайней мере на уровне Python, я замечаю, что они используют одни и те же процедуры для назначения атрибутов, исправьте меня, если я ошибаюсь:
предполагатьa
это экземпляр пользовательского класса, просто обычный класс:
class A:
pass
a = A()
a.x = ...
затемa.x = ..
Запускаетtype(a).__setattr__(...)
который выполняет следующие шаги:
Замечания:type(a).__setattr__
найду__setattr__
вobject
встроенный класс
1) Ищите дескриптор данных вtype(a).__mro__
.
2) Если дескриптор данных был найден, вызовите его__set__
метод и выход.
3) Если дескриптор данных не был найден вtype(a).__mro__
затем добавьте атрибутa.__dict__
, a.__dict__['x'] = ...
С классами - экземплярами метаклассов, процесс аналогичен:
class A(metaclass=type):
pass
затем:A.x = ...
переводится наtype(A).__setattr__(...)
который выполняет следующие шаги:
Замечания:type(A).__setattr__
найду__setattr__
вtype
встроенный класс
1) Ищите дескриптор данных вtype(A).__mro__
2) Если дескриптор данных был найден, вызовите его__set__
метод и выход.
3) Если дескриптор данных не был найден вtype(A).__mro__
затем добавьте атрибутA.__dict__
, a.__dict__['x'] = ...
Ноobject.__setattr__
не работает для классов:
>>> object.__setattr__(A, 'x', ...)
TypeError: can't apply this __setattr__ to type object
и наоборот,type.__setattr__
не работает для случаевA
:
>>> type.__setattr__(A(), 'x', ...)
TypeError: descriptor '__setattr__' requires a 'type' object but received a 'A'
Ммм! Должно быть что-то отличное между этими двумя методами. Это тонко, но, тем не менее, верно!
Предположительно оба метода выполняют одинаковые шаги внутри__setattr__
, в чем разница междуtype.__setattr__
а такжеobject.__setattr__
чтобыtype.__setattr__
ограничено классами иobject.__setattr__
ограничено экземплярами классов?