2010-03-06 13 views
9

Mi código funcionó bien cuando todo estaba en un solo archivo. Ahora, estoy dividiendo las clases en diferentes módulos. Los módulos recibieron el mismo nombre que las clases. Tal vez esto sea un problema, porque MainPage está fallando cuando se carga. ¿Piensa que estoy tratando de heredar de un módulo? ¿Pueden ocurrir colisiones de espacio de nombres de módulo/clase?Python: Nombre de clase igual que el nombre del archivo/módulo conduce a un problema de herencia?

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 ... 

fracaso Rastreo:

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) 

ACTUALIZACIÓN Parece que lo he resuelto. Esta importación funciona mucho mejor:

from BaseHandler import BaseHandler 

¿Es malo tener el módulo y el nombre de clase iguales?

+6

No es malo que el módulo y el nombre de clase sean los mismos siempre que la carcasa sea distinta. En Python, es una convención que los nombres de los módulos sean minúsculos y que los nombres de las clases sean CamelCase. Le sugiero que lea la Guía de estilo de Python (PEP 8) - http://www.python.org/dev/peps/pep-0008/. ¡Es inmensamente útil! – jathanism

Respuesta

17

Sí, los nombres de los módulos comparten el mismo espacio de nombres que todo lo demás, y, sí, Python cree que está tratando de heredar de un módulo.

Cambio:

class MainPage(BaseHandler): 

a:

class MainPage(BaseHandler.BaseHandler): 

y usted debe ser bueno para ir. De esta forma, dices "por favor hereda de la clase BaseHandler en el módulo BaseHandler".

Alternativamente, podría cambiar:

import BaseHandler 

a:

from BaseHandler import BaseHandler 
16

En primer lugar los nombres de los archivos deben estar en minúsculas. Esa es la convención de Python que ayuda a evitar confusiones como esta, al menos la mayor parte del tiempo.

A continuación, su importación desde MainHandler.py es incorrecta. Está importando BaseHandler (el módulo) y haciendo referencia a él como si fuera una clase. La clase es en realidad BaseHandler.BaseHandler. Debes referenciarlo como tal.

Pruébalo y debería funcionar para ti.

+8

+1 para los nombres de archivo en minúscula –

Cuestiones relacionadas