在类外的python模块中访问函数

时间:2015-01-30 12:20:19

标签: python inheritance methods overwrite

我有下一个情况。我尝试在BaseHTTPServer.py文件中覆盖BaseHTTPRequestHandler中的方法send_error。 BaseHTTPServer.py具有关于send_error方法的结构:

def _quote_html(html):
    blah
    blah

class HTTPServer():
    blah
    blah
class BaseHTTPRequestHandler():
    blah
    blah
    def send_error(self):
        blah
        blah
        content = (self.error_message_format %
                {'code': code, 'message': _quote_html(message), 'explain': explain})

这里调用send_error方法_quote_html函数。它在BaseHTTPServer.py文件中工作但如果创建我自己的httphandler,继承BaseHTTPRequestHandler并尝试覆盖send_error,我的函数send_error无法访问位于BaseHTTPRequestHandler类之外的BaseHTTPServer.py文件中的_quote_html函数:

Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 593, in process_request_thread
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/python_codes/Junior/Level1/C&C/HttpServer/HttpHandler.py", line 12, in __init__
    BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
  File "/usr/lib/python2.7/SocketServer.py", line 649, in __init__
    self.handle()
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 340, in handle
    self.handle_one_request()
  File "/python_codes/Junior/Level1/C&C/HttpServer/HttpHandler.py", line 26, in handle_one_request
    if not self.parse_request():
  File "/usr/lib/python2.7/BaseHTTPServer.py", line 286, in parse_request
    self.send_error(400, "Bad request syntax (%r)" % requestline)
  File "/python_codes/Junior/Level1/C&C/HttpServer/HttpHandler.py", line 106, in send_error
    {'code': code, 'message': _quote_html(message), 'explain': explain})
NameError: global name '_quote_html' is not defined 

所以我的问题是如何在模块文件中访问父类外的函数?在我的例子中,从send_error()到_quote_html()。 Everythong从BaseHTTPServer.py导入:

from BaseHTTPServer import *

2 个答案:

答案 0 :(得分:1)

将您的功能重命名为quote_html。或者像这样明确导入:

from BaseHTTPServer import _quote_html

自:

  来自M import *的

不会导入名称以。开头的对象   下划线。

答案 1 :(得分:0)

我试过这个并且工作正常:

def b():
    return 45
class Person(object):

    def getYears(self):
        return self.b()

print Person().getYears()

所以,我看到的唯一区别是括号之间的'对象'。