2015-01-30 2 views
0

다음 상황이 있습니다. 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을 BaseHTTPRequestHandler 클래스의 외부 BaseHTTPServer.py 파일에있는 _quote_html 기능에 액세스 할 수 없습니다 내 기능 SEND_ERROR 덮어 쓰기를 시도 :

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 * 
+0

당신은 어떻게'BaseHttpRequestHandler'에서 상속 받고 있습니까? –

+0

보통 : class myhandler (BaseHttpRequestHandler) : –

답변

1

quote_html에 함수 이름을 바꿉니다. 또는 다음과 같이 명시 적으로 가져 오기를 수행

from BaseHTTPServer import _quote_html 

이후 :

M에서 수입 *는 이름이 밑줄로 시작하는 개체를 가져 오지 않습니다.

+0

두 번째는 명시 적 임포트 제안입니다. from import *'는 일반적으로 로컬 네임 스페이스를 오염시키고 항목의 출처를 추적하기 어렵게하므로 frowned입니다. –

+0

감사합니다. 완벽하게 작동합니다. –

+0

@ ВладХристенко 비록 ... 받아들이는 것이 좋겠지 만 ... 정당한 대답을 "upvote 및 accept"하십시오. –

0

나는이 시도하고 그것을 잘 작동합니다 :

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

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

print Person().getYears() 

그래서, 내가 보는 유일한 차이점은 괄호 사이의 '객체'입니다.

+0

틀린 질문 친구 –

관련 문제