Is there a reason not to do this?

Michele Simionato michele.simionato at gmail.com
Sat Dec 2 09:47:47 EST 2006


Ron Garret wrote:
>
> Doesn't work for me:
>
> >>> c2
> <__main__.C2 instance at 0x51e850>
> >>> c2.m1()
> G
> >>> class C2:
> ...   __metaclass__ = modify_in_place
> ...   def m1(self): print 'Q'
> ...
> >>> c2.m1()
> G
> >>> C2().m1()
> Q

I assume your original C2 class was defined in a different module, not
in the current global
namespace. What do you get from  c.__class__.__module__ ? It should be
__name__ for
this approach to work.

class C2:
   def m1(self):
      return 'G'

c = C2()

def modify_in_place(name,bases,clsdict):
    cls = globals()[name]
    for attr,val in clsdict.iteritems():
        setattr(cls,attr,val)
    return cls

# Replace second C2 class above with this
class C2:
    __metaclass__ = modify_in_place
    def m1(self):
       return 'Q'

assert c.m1() == 'Q'
assert c.__class__.__module__ == __name__ # make sure c.__class__ is
defined in the current module


     Michele Simionato




More information about the Python-list mailing list