Inheritance crossover packages

Bruno Desthuilliers bdesth.quelquechose at free.quelquepart.fr
Mon Aug 11 15:39:17 EDT 2008


Johannes Bauer a écrit :
> Hello group,
> 
> I'm having a seemingly simple problem. I want to generate a hierarchy of 
> modules, like this one:
> 
> GenerationScripts/
> GenerationScripts/dhcp
> GenerationScripts/bind9
> 
> And the files:
> 
> GenerationScripts/dhcp/__init__.py
> GenerationScripts/bind9/generator.py
> GenerationScripts/bind9/__init__.py
> GenerationScripts/mastergen.py
> GenerationScripts/__init__.py
> 
> All packages (bind9, dhcp) should inherit from the master generator 
> "mastergen".

Sorry but this makes no sense. inheritance is a class feature - packages 
and modules don't 'inherit'.

> I'm at the very beginning:
> 
> $ cat GenerationScripts/__init__.py
> import bind9
> #import dhcpd
> 
> $ cat GenerationScripts/bind9/__init__.py
> import GenerationScripts.bind9.generator
> 
> $ cat GenerationScripts/bind9/generator.py
> from GenerationScripts import mastergen
> 
> class generator(mastergen):

<OT>pep08 : class identifiers should be in CamelCase</OT>

>     def __init__(self):
>         print "init bind9 generator"

here, mastergen is a module object, not a class object. This just can't 
work. What are you trying to do exactly ???

> Now what happens when I import GenerationScripts and try to create a 
> instance of GenerationScripts.bind9.generator is the following:
> 
> Traceback (most recent call last):
>   File "./Generate.py", line 3, in <module>
>     import GenerationScripts
>   File "/home/joe/x/GenerationScripts/__init__.py", line 3, in <module>
>     import bind9
>   File "/home/joe/x/GenerationScripts/bind9/__init__.py", line 4, in 
> <module>
>     import GenerationScripts.bind9.generator
>   File "/home/joe/x/GenerationScripts/bind9/generator.py", line 7, in 
> <module>
>     class generator(mastergen):
> TypeError: Error when calling the metaclass bases
>     module.__init__() takes at most 2 arguments (3 given)
 >
> I really don't get it - and I've searched and found the same problem, 
> read the descirption - but still don't get it. What's happening here?

What's happening is that you try to use a module instance (really: an 
instance of class 'module') as a base class - and, as a result, the 
'module' class as a metaclass. But 1/ the 'module' class initializer's 
signature is not compatible with a metaclass signature, and 2/ anyway, 
the 'module' class constructor doesn't return a class object anyway.

I don't know what you trying to do, but I suggest you (re)read the 
FineManual(tm)'s relevant sections, that is, sections about modules and 
packages, and sections about Python's 'new-style' object model.




More information about the Python-list mailing list