2010-03-06 19 views
9

Mã của tôi hoạt động tốt khi tất cả trong một tệp. Bây giờ, tôi đang chia lớp thành các mô-đun khác nhau. Các mô-đun đã được đặt cùng tên với các lớp. Có lẽ đây là một vấn đề, bởi vì MainPage không thành công khi được tải. Liệu nó có nghĩ rằng tôi đang cố gắng kế thừa từ một mô-đun? Có thể xảy ra va chạm không gian tên mô-đun/lớp không?Python: Tên lớp giống với tên tệp/mô-đun dẫn đến sự cố kế thừa?

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

Không 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) 

CẬP NHẬT Tôi dường như đã giải quyết nó. Quá trình nhập này hoạt động tốt hơn nhiều:

from BaseHandler import BaseHandler 

Có kiểu mô-đun và tên lớp không giống nhau không?

+6

Không phải kiểu xấu và có tên mô-đun và tên lớp giống nhau miễn là lớp vỏ là khác biệt. Trong Python, quy ước có tên mô-đun là tất cả các chữ thường và tên lớp là CamelCase. Tôi khuyên bạn nên đọc Hướng dẫn kiểu Python (PEP 8) - http://www.python.org/dev/peps/pep-0008/. Nó vô cùng hữu ích! – jathanism

Trả lời

17

Có, tên mô-đun chia sẻ cùng một không gian tên như mọi thứ khác, và, có, Python cho rằng bạn đang cố gắng kế thừa từ một mô-đun.

Thay đổi:

class MainPage(BaseHandler): 

tới:

class MainPage(BaseHandler.BaseHandler): 

và bạn sẽ được tốt để đi. Bằng cách đó, bạn đang nói "hãy kế thừa từ lớp BaseHandler trong mô-đun BaseHandler".

Cách khác, bạn có thể thay đổi:

import BaseHandler 

tới:

from BaseHandler import BaseHandler 
16

Đầu tiên của tất cả các tên tập tin phải được tất cả chữ thường. Đó là quy ước Python giúp tránh nhầm lẫn như thế này, ít nhất là phần lớn thời gian.

Tiếp theo, quá trình nhập của bạn từ withing MainHandler.py là sai. Bạn đang nhập BaseHandler (mô-đun) và tham chiếu nó như thể đó là một lớp học. Lớp học thực sự là BaseHandler.BaseHandler. Bạn cần phải tham khảo nó như vậy.

Hãy thử điều đó và nó sẽ phù hợp với bạn.

+8

+1 cho mẹo tên tệp chữ thường –

Các vấn đề liên quan