2010-03-06 7 views
9

Mein Code funktionierte gut, wenn alles in einer Datei war. Jetzt teile ich Klassen in verschiedene Module auf. Die Module haben den gleichen Namen wie die Klassen. Vielleicht ist das ein Problem, weil MainPage fehlschlägt, wenn es geladen wird. Glauben Sie, dass ich versuche, von einem Modul zu erben? Können Kollisionen von Modul-/Klassennamespaces auftreten?Python: Klassenname wie Datei-/Modulname führt zu Vererbungsproblem?

MainPage.py

import BaseHandler 
from models import Item 
from Utils import render 

class MainPage(BaseHandler): 
    def body(self, CSIN=None): #@UnusedVariable 
     self.header('Store') 
     items = Item.all().order('name').fetch(10) 
     render('Views/table.html', self, {'items': items}) 
     self.footer() 

BaseHandler.py

from google.appengine.ext import webapp 
from google.appengine.api import users 
from Utils import * 

# Controller 
class BaseHandler(webapp.RequestHandler): 
    # ... continues ... 

Failure Traceback:

Traceback (most recent call last): 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3180, in _HandleRequest 
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 3123, in _Dispatch 
    base_env_dict=env_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 515, in Dispatch 
    base_env_dict=base_env_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2382, in Dispatch 
    self._module_dict) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2292, in ExecuteCGI 
    reset_modules = exec_script(handler_path, cgi_path, hook) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 2188, in ExecuteOrImportScript 
    exec module_code in script_module.__dict__ 
    File "C:\Users\odp\workspace\Store\src\Main.py", line 5, in <module> 
    import MainPage 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1267, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1917, in load_module 
    return self.FindAndLoadModule(submodule, fullname, search_path) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1267, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1819, in FindAndLoadModule 
    description) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1267, in Decorate 
    return func(self, *args, **kwargs) 
    File "C:\Program Files\Google\google_appengine\google\appengine\tools\dev_appserver.py", line 1770, in LoadModuleRestricted 
    description) 
    File "C:\Users\odp\workspace\Store\src\MainPage.py", line 10, in <module> 
    class MainPage(BaseHandler): 
TypeError: Error when calling the metaclass bases 
    module.__init__() takes at most 2 arguments (3 given) 

UPDATE Ich habe es anscheinend gelöst. Dieser Import funktioniert viel besser:

from BaseHandler import BaseHandler 

Ist es schlechte Art, das Modul und den Klassennamen gleich zu haben?

+6

Es ist kein schlechter Stil, wenn Modul und Klassenname gleich sind, solange das Gehäuse eindeutig ist. In Python ist es üblich, dass Modulnamen Kleinbuchstaben und Klassennamen CamelCase sind. Ich schlage vor, Sie lesen den Python Style Guide (PEP 8) - http://www.python.org/dev/peps/pep-0008/. Es ist immens hilfreich! – jathanism

Antwort

17

Ja, Modulnamen teilen sich den gleichen Namensraum wie alles andere, und, ja, Python denkt, dass Sie versuchen, von einem Modul zu erben.

Wechsel:

class MainPage(BaseHandler): 

zu:

class MainPage(BaseHandler.BaseHandler): 

und Sie sollten gut zu gehen. Auf diese Weise sagen Sie "Bitte erben Sie von der BaseHandler-Klasse im BaseHandler-Modul".

Alternativ können Sie ändern:

import BaseHandler 

zu:

from BaseHandler import BaseHandler 
16

Zunächst werden die Dateinamen sollten klein geschrieben sein. Das ist eine Python-Konvention, die hilft, Verwirrung zumindest in den meisten Fällen zu vermeiden.

Als nächstes ist Ihr Import von MainHandler.py falsch. Sie importieren BaseHandler (das Modul) und verweisen darauf, als wäre es eine Klasse. Die Klasse ist eigentlich BaseHandler.BaseHandler. Sie müssen es als solches bezeichnen.

Versuchen Sie das und es sollte für Sie arbeiten.

+8

+1 für den Kleinbuchstaben Dateinamen Tipp –