Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's the difference between setattr() and object.__setattr__()?

Tags:

python

setattr

I know that you can't call object.__setattr__ on objects not inherited from object, but is there anything else that is different between the two? I'm working in Python 2.6, if this matters.

like image 908
paper.cut Avatar asked Sep 26 '11 17:09

paper.cut


People also ask

What is the Setattr () used for?

The setattr() function sets the value of the specified attribute of the specified object.

What does __ Setattr __ do in Python?

Python setattr() method is used to assign the object attribute its value.

What is use of Setattr () method in inheritance?

What is the use of the setattr() method in inheritance? The use case of setattr() in inheritance is the same, i.e., to assign value to the attributes of an object.


1 Answers

Reading this question again I misunderstood what @paper.cut was asking about: the difference between classic classes and new-style classes (not an issue in Python 3+). I do not know the answer to that.


Original Answer*

setattr(instance, name, value) is syntactic sugar for instance.__setattr__(name, value)**.

You would only need to call object.__setattr__(...) inside a class definition, and then only if directly subclassing object -- if you were subclassing something else, Spam for example, then you should either use super() to get the next item in the heirarchy, or call Spam.__setattr__(...) -- this way you don't risk missing behavior that super-classes have defined by skipping over them directly to object.


* applies to Python 3.0+ classes and 2.x new-style classes


**There are two instances where setattr(x, ...) and x.__setattr__(...) are not the same:

  • x itself has a __setattr__ in it's private dictionary (so x.__dict__[__setattr__] = ... (this is almost certainly an error)

  • x.__class__ has a __getattribute__ method -- because __getattribute__ intercepts every lookup, even when the method/attribute exists

NB These two caveats apply to every syntactic sugar shortcut:

  • setattr
  • getattr
  • len
  • bool
  • hash
  • etc
like image 158
Ethan Furman Avatar answered Oct 15 '22 23:10

Ethan Furman