In an inherited class, "embedded" classes is referenced?

Diez B. Roggisch deets at nospam.web.de
Wed Dec 19 17:30:03 EST 2007


Christian Joergensen schrieb:
> Hello
> 
> I stumpled upon this "feature" during my work tonight, and found it 
> a bit confusing:
> 
>>>> class A(object):
> ...     class C: 
> ...         foobar = 42
> ... 
>>>> class B(A): pass
> ... 
>>>> A.C   
> <class __main__.C at 0xb7cf735c>
>>>> B.C
> <class __main__.C at 0xb7cf735c>
>>>> B.C.foobar = 60
>>>> A.C.foobar                  
> 60                              
> 
> When I inherit B from A, I would expect that A.C and B.C would be two
> different classes? But apparently not.
> 
> Can anyone give me an explanation? Or a better workaround than 
> something along the line of:

Why should they be different? The class-statment of A is only exectuted 
once, as is the nested class' C. Which makes A.C just a "normal" 
class-variable. That is of course shared amongst subclasses. As are 
methods, properties and every other thing living in the A.__dict__ due 
to the MRO in python.

The more important question is: what do you need C for? Do you have by 
any chance a Java-background and think of C as inner/nested class as in 
Java? This feature doesn't exist in Python.

Your workaround might be implementable using a metaclass in a more 
conveinient way, but I'm not sure-footed enough with metaclasses to 
provide a solution out of my head now.

Diez



More information about the Python-list mailing list