类名与文件/模块名相同导致继承问题

12 投票
2 回答
7636 浏览
提问于 2025-04-15 20:05

我的代码在一个文件里运行得很好。现在,我把类分成了不同的模块。模块的名字和类的名字是一样的。可能这就是问题所在,因为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 (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

模块和类名字一样算不算不好的风格呢?

2 个回答

18

首先,文件名应该全部使用小写字母。这是Python的一个约定,通常可以帮助避免一些混淆。

接下来,你在MainHandler.py中的导入写错了。你导入了BaseHandler(这是一个模块),但你把它当成了一个类来使用。实际上,类是BaseHandler.BaseHandler。你需要这样来引用它。

试试看,这样应该就能正常工作了。

18

是的,模块名称和其他所有东西都在同一个命名空间里,没错,Python会认为你是在尝试从一个模块继承。

你可以把:

class MainPage(BaseHandler):

改成:

class MainPage(BaseHandler.BaseHandler):

这样就可以了。这样你就是在说“请从BaseHandler模块里的BaseHandler类继承”。

另外,你也可以把:

import BaseHandler

改成:

from BaseHandler import BaseHandler

撰写回答