[Edu-sig] Ditch "self"?

Paul D. Fernhout pdfernhout at kurtz-fernhout.com
Wed Oct 24 14:57:17 CEST 2007


Dethe-

Thanks; that was very helpful in improving my understanding of Python in
practice.

--Paul Fernhout

Dethe Elza wrote:
> Paul,
> 
> to assign a function to an instance object (rather than a class) as a
> new method, use the "new" module:
> 
> ===== start module prototype.py ======
> 
> 
> '''
> Example of adding methods to an instance object and a class
> '''
> 
> import new
> 
> class Foo(object):
> 
>     def bar(self):
>         print 'bar', self.__class__
> 
> 
> # outside of class Foo, define some functions to turn into methods:
> 
> def baz(self):
>     print 'baz', self.__class__
> 
> def foobar(self):
>     print 'foobar', self.__class__
> 
> # make some instances
> 
> a = Foo()
> b = Foo()
> 
> # make baz a method of Foo, both a and b should be able to call it
> 
> Foo.baz = baz
> 
> print 'baz:', Foo.baz
> 
> a.baz()
> b.baz()
> 
> # make foobar a method of a, calling b.foobar should fail
> 
> a.foobar = new.instancemethod(foobar, a, a.__class__)
> 
> print 'foobar:', a.foobar
> 
> a.foobar()
> b.foobar() # fails
> 
> ===== end of module ======
> 
> and when you run it:
> 
> $ python prototype_based.py
> baz: <unbound method Foo.baz>
> baz <class '__main__.Foo'>
> baz <class '__main__.Foo'>
> foobar: <bound method Foo.foobar of <__main__.Foo object at 0x75990>>
> foobar <class '__main__.Foo'>
> Traceback (most recent call last):
>   File "prototype_based.py", line 42, in <module>
>     b.foobar() # fails
> AttributeError: 'Foo' object has no attribute 'foobar'
> 
> 
> More info: http://docs.python.org/lib/module-new.html
> 
> HTH
> 
> --Dethe
> 
> 


More information about the Edu-sig mailing list