How to copy a ClassObject?

Duncan Booth duncan.booth at invalid.invalid
Tue Mar 20 15:43:00 CET 2007


Karlo Lozovina <_karlo_ at _mosor.net_> wrote:

> After this, tmp is a copy of First, and modifying tmp.name will not
> affect First.name.

As Peter said, it's not a copy, its a subclass.

Modifying tmp.name would affect First.name (although in your example it is 
immutable so you cannot modify it).
Also, rebinding First.name will change the value you see in tmp.name 
whereas rebinding tmp.name will hide the copy inherited from First.name (so 
a later del would restore it).

> If my code is somehow mistaken and might not function properly in all 
> cases, please correct me. 

Consider yourself corrected.

You could do what you are attempting with:

   tmp = new.classobj('tmp', First.__bases__, dict(First.__dict__))

which creates a new class named 'tmp' with the same base classes and a copy 
of First's __dict__ except that the __name__ attribute for the new class 
will be set to 'tmp'. The attribute values are still shared between the 
classes (which is significant only if they are mutable), but otherwise they 
won't be sharing state.

I have no idea why you would want to do this, nor even why you would want a   
'name' attribute when Python already gives you '__name__'.



More information about the Python-list mailing list