Python:与文件/模块名称相同的类名导致继承问题?

Nic*_*ner 10 python import google-app-engine module class

当它全部在一个文件中时,我的代码工作得很好.现在,我正在将课程分成不同的模块.这些模块的名称与类相同.也许这是一个问题,因为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()
Run Code Online (Sandbox Code Playgroud)

BaseHandler.py

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

# Controller
class BaseHandler(webapp.RequestHandler):
     # ... continues ... 
Run Code Online (Sandbox Code Playgroud)

失败追溯:

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)
Run Code Online (Sandbox Code Playgroud)

更新我似乎解决了它.这个导入效果更好:

from BaseHandler import BaseHandler
Run Code Online (Sandbox Code Playgroud)

模块和类名是否相同是不好的风格?

Dan*_*ach 17

是的,模块名称与其他所有名称共享相同的名称空间,是的,Python认为您正在尝试从模块继承.

更改:

class MainPage(BaseHandler):
Run Code Online (Sandbox Code Playgroud)

至:

class MainPage(BaseHandler.BaseHandler):
Run Code Online (Sandbox Code Playgroud)

你应该好好去.这样,你说"请从BaseHandler模​​块中的BaseHandler类继承".

或者,您可以更改:

import BaseHandler
Run Code Online (Sandbox Code Playgroud)

至:

from BaseHandler import BaseHandler
Run Code Online (Sandbox Code Playgroud)


jat*_*ism 16

首先,文件名应全部小写.这是Python的约定,有助于避免这种混乱,至少在大多数情况下.

接下来,从withing导入MainHandler.py是错误的.您正在导入BaseHandler(模块)并引用它,就像它是一个类一样.实际上是这门课BaseHandler.BaseHandler.你需要这样引用它.

试试吧,它应该适合你.