【发布时间】:2017-09-30 01:53:29
【问题描述】:
type.__setattr__ 用于类,基本上是元类的实例。另一方面,object.__setattr__ 用于类的实例。这是完全可以理解的。
我没有看到这两种方法之间有显着差异,至少在 Python 级别,我注意到这两种方法使用相同的属性分配过程,如果我错了,请纠正我:
假设a是一个用户自定义类的实例,只是一个普通类:
class A:
pass
a = A()
a.x = ...
然后a.x = .. 调用type(a).__setattr__(...) 执行以下步骤:
注意:type(a).__setattr__ 将在 object 内置类中找到 __setattr__
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__ 将在 type 内置类中找到 __setattr__
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__仅限于类的实例?
【问题讨论】: