type.__setattr__
用于类,基本上是元类的实例。object.__setattr__
另一方面,用于类的实例。这是完全可以理解的。
我没有看到这两种方法之间有显着差异,至少在Python级别,我注意到这两种方法使用相同的属性分配过程,如果我错了,请纠正我:
Suppose a
是一个用户定义类的实例,只是一个普通类:
class A:
pass
a = A()
a.x = ...
then a.x = ..
调用type(a).__setattr__(...)
它执行以下步骤:
Note: type(a).__setattr__
会发现__setattr__
in object
内置类
1) 查找数据描述符type(a).__mro__
.
2) 如果找到数据描述符,则调用它的__set__
方法并退出。
3) 如果没有找到数据描述符type(a).__mro__
,然后添加属性a.__dict__
, a.__dict__['x'] = ...
对于类——元类的实例,过程是类似的:
class A(metaclass=type):
pass
then: A.x = ...
被翻译成type(A).__setattr__(...)
它执行以下步骤:
Note: type(A).__setattr__
会发现__setattr__
in type
内置类
1) 查找数据描述符type(A).__mro__
2) 如果找到数据描述符,则调用它的__set__
方法并退出。
3) 如果没有找到数据描述符type(A).__mro__
,然后添加属性A.__dict__
, a.__dict__['x'] = ...
But 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__
and object.__setattr__
以便type.__setattr__
仅限于班级和object.__setattr__
仅限于类的实例?