Мой код хорошо работал, когда это было все в одном файле. Теперь, я разделяю классы на различные модули. Модулям дали то же имя как классы. Возможно, это - проблема, потому что MainPage
перестал работать, когда это загружается. Это думает, что я пытаюсь наследоваться модулю? Конфликты пространства имен модуля/класса могут произойти?
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 ...
Отказ 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)
ОБНОВЛЕНИЕ я, кажется, решил его. Этот импорт работает намного лучше:
from BaseHandler import BaseHandler
Это - плохой стиль, чтобы иметь имя модуля и имя класса быть тем же?
Да, имена модулей используют то же пространство имен, что и все остальное, и, да, Python думает, что вы пытаетесь наследовать от модуля.
Измените:
class MainPage(BaseHandler):
на:
class MainPage(BaseHandler.BaseHandler):
, и все будет в порядке. Таким образом, вы говорите: «Пожалуйста, наследуйте от класса BaseHandler в модуле BaseHandler».
Вы также можете изменить:
import BaseHandler
на:
from BaseHandler import BaseHandler
Прежде всего, имена файлов должны быть в нижнем регистре. Это соглашение Python, которое помогает избежать подобной путаницы, по крайней мере, в большинстве случаев.
Далее, ваш импорт из MainHandler.py
неверен. Вы импортируете BaseHandler
(модуль) и ссылаетесь на него, как на класс. На самом деле это класс BaseHandler.BaseHandler
. Вам нужно ссылаться на это как на таковое.
Попробуйте, и это должно сработать.