En Sun, 10 Jun 2007 18:16:12 -0300, James T. Dennis <[EMAIL PROTECTED]>  
escribió:

>  When I try something like this I run into a little problem:
>
>       class Foo:
>           def foo(self):
>               return "foo"
>       class Bar:
>           def bar(self):
>               return "bar"
>
>       f = Foo()
>       f.__dict__.update(Bar.__dict__)
>
>  ... the problem is that while f now has a "bar" method it doesn't
>  work quite like a normal instance method:
>
>       >>> f.bar()
>       Traceback (most recent call last):
>         File "<stdin>", line 1, in ?
>       TypeError: bar() takes exactly 1 argument (0 given)
>       >>>
>
>  ... though I can get by with f.bar(f)

Bar.__dict__ contains *unbound* methods - that is, methods not linked to  
any particular instance. If you copy them directly into f.__dict__ you  
lose the "magic" that binds methods to instances.
You could store a bound method into the instance but it's not a good idea  
(there are cyclic references).
I think the easiest way is to define a dynamic class (as the subject on  
this old thread suggests):

py> f = Foo()
py> Foo2 = type("Foo2", (Foo,Bar), {})
py> f.__class__ = Foo2
py> f.bar()
'bar'

The code above changes the object class once it was created, but you don't  
have to. Also, you don't have to use a different class name (altough it  
may be confusing...):

py> f = type("Foo", (Foo,Bar), {})()
py> f.bar()
'bar'

>  This "new" module seems to be the key to it all;

It's almost useless now that types are callable.

> but the only docs I have for that say:
>
>>>> help(new)
> Help on module new:
> [...]
> MODULE DOCS
>     http://www.python.org/doc/current/lib/module-new.html

Did you follow the above link?

-- 
Gabriel Genellina

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to