¿Qué tan diferente es el tipo .__ setattr__ del objeto .__ setattr__?
type.__setattr__
se usa para clases, básicamente instancias de metaclases.object.__setattr__
por otro lado, se usa para instancias de clases. Esto se entiende totalmente.
No veo una diferencia significativa entre los dos métodos, al menos a nivel de Python, noto que los dos usan los mismos procedimientos para la asignación de atributos, corrígeme si me equivoco:
Suponera
es una instancia de una clase definida por el usuario, solo una clase normal:
class A:
pass
a = A()
a.x = ...
entoncesa.x = ..
invocatype(a).__setattr__(...)
que realiza los siguientes pasos:
Nota:type(a).__setattr__
encontrará__setattr__
enobject
clase integrada
1) Busque un descriptor de datos entype(a).__mro__
.
2) Si se encontró un descriptor de datos, llame a su__set__
método y salir.
3) Si no se encontró un descriptor de datos entype(a).__mro__
, luego agregue atributo aa.__dict__
, a.__dict__['x'] = ...
Con clases - instancias de metaclases, el proceso es similar:
class A(metaclass=type):
pass
entonces:A.x = ...
se traduce atype(A).__setattr__(...)
que realiza los siguientes pasos:
Nota:type(A).__setattr__
encontrará__setattr__
entype
clase integrada
1) Busque un descriptor de datos entype(A).__mro__
2) Si se encontró un descriptor de datos, llame a su__set__
método y salir.
3) Si no se encontró un descriptor de datos entype(A).__mro__
, luego agregue atributo aA.__dict__
, a.__dict__['x'] = ...
Peroobject.__setattr__
no funciona para las clases:
>>> object.__setattr__(A, 'x', ...)
TypeError: can't apply this __setattr__ to type object
y viceversa,type.__setattr__
no funciona para instancias deA
:
>>> type.__setattr__(A(), 'x', ...)
TypeError: descriptor '__setattr__' requires a 'type' object but received a 'A'
Hmmm! Debe haber algo diferente entre los dos métodos. ¡Esto es sutil, pero cierto de todos modos!
Presumiblemente, los dos métodos realizan los mismos pasos dentro__setattr__
, Cuál es la diferencia entretype.__setattr__
yobject.__setattr__
así que esotype.__setattr__
se limita a clases yobject.__setattr__
se limita a instancias de clases?