I don't know for why using __setattr__
instead simple referencing like x.a=1
.
I understand this example:
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
x=Rectangle()
x.width=20
x.__setattr__('height',30)
setattr(x,'width',99)
but don't get why using code depending on string ('height').
Could you explain me what are advantages of __setattr__
?
You don't call it yourself. Period. If you need to use a string because you don't know the name beforehand (very bad idea in 99% of all cases where one might think they need this, nearly always a dict or list is a better/saner choice), you use the built-in setattr
function.
However, it is called for you - when you do a.x = ...
, that's done as a.__setattr__('x', ...)
(this is propably an oversimplification). And some objects overload it to allow some trickery, e.g. to emulate immutability. See the documentation of "special methods".