само по себе могло бы быть нулевым. (Ничто из этого не должно быть важно для вас, если вам не нужно работать с 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__ ограничено экземплярами классов?

Ответы на вопрос(1)

Ваш ответ на вопрос