Adding a Method to a Class Instance at Runtime
Credit: an anonymous contributor, Moshe Zadka
Problem
During debugging, you want to identify certain specific instance
objects so that print statements display more
information when applied to those objects.
Solution
The print statement implicitly calls an
object’s _ _str_ _ special method, so we can rebind
the _ _str_ _ attribute of the object to a
suitable new bound method, which the new module
lets us build:
import string
import new
def rich_str(self):
classStr = ''
for name, value in self._ _class_ _._ _dict_ _.items(
) + self._ _dict_ _.items( ):
classStr += string.ljust(name, 15) + '\t' + str(value) + '\n'
return classStr
def addStr(anInstance):
anInstance._ _str_ _ = new.instancemethod(rich_str,
anInstance, anInstance._ _class_ _)
# Test it
class TestClass:
classSig = 'My Sig'
def _ _init_ _(self, a = 1, b = 2, c = 3):
self.a = a
self.b = b
self.c = c
test = TestClass( )
addStr(test)
print testDiscussion
This recipe demonstrates the runtime addition of a _ _str_ _ special method to a class instance. Python calls
obj._ _str_ _ when you ask for
str(obj) or when you print
obj. Changing the _ _str_ _
special method of obj lets you display more
information for the specific instance object in question when the
instance is printed during debugging.
The recipe as shown is very simple and demonstrates the use of the
special attributes _ _dict_ _ and
_ _class_ _. A serious defect of this approach is
that it creates a reference cycle in the ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access