Python: Имя класса то же как файл/имя модуля приводит к проблеме наследования?

Мой код хорошо работал, когда это было все в одном файле. Теперь, я разделяю классы на различные модули. Модулям дали то же имя как классы. Возможно, это - проблема, потому что 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

Это - плохой стиль, чтобы иметь имя модуля и имя класса быть тем же?

10
задан Daniel Daranas 28 August 2013 в 16:37
поделиться

2 ответа

Да, имена модулей используют то же пространство имен, что и все остальное, и, да, Python думает, что вы пытаетесь наследовать от модуля.

Измените:

class MainPage(BaseHandler):

на:

class MainPage(BaseHandler.BaseHandler):

, и все будет в порядке. Таким образом, вы говорите: «Пожалуйста, наследуйте от класса BaseHandler в модуле BaseHandler».

Вы также можете изменить:

import BaseHandler

на:

from BaseHandler import BaseHandler
17
ответ дан 3 December 2019 в 14:34
поделиться

Прежде всего, имена файлов должны быть в нижнем регистре. Это соглашение Python, которое помогает избежать подобной путаницы, по крайней мере, в большинстве случаев.

Далее, ваш импорт из MainHandler.py неверен. Вы импортируете BaseHandler (модуль) и ссылаетесь на него, как на класс. На самом деле это класс BaseHandler.BaseHandler . Вам нужно ссылаться на это как на таковое.

Попробуйте, и это должно сработать.

16
ответ дан 3 December 2019 в 14:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: