2010-12-20 2 views
1

나는 계급 상속 경험이별로 없다. 저를 도와 아래의 코드를 살펴 준비해주십시오Python 클래스 상속의 메소드가 누락 되었습니까?

result = handle.submit(system, service, logRequest) 
AttributeError: 'NoneType' object has no attribute 'submit' 

을하지만 난 그것을 변경하는 경우 :이 방법을 제출 말한다

class Handle(STAFHandle): 

    def __init__(self, HandleName): 
     handle = STAFHandle.__init__(self, HandleName) 
     self.initLogger(handle) 

    def initLogger(self, handle): 
     self.logger = Logging(handle, 'Test') 

handle = Handle('test') 
handle.logger.info('test') 

을 정의되지 않은

class Handle(STAFHandle): 
    def __init__(self, HandleName): 
     handle = STAFHandle.__init__(self, HandleName) 

    def initLogger(self, handle): 
     self.logger = Logging(handle, 'Test') 

handle = Handle('test') 
handle.initLogger(handle) 
handle.logger.info('test') 

가 작동 . 왜 차이가 있습니까? 고마워요 !!

건배, ZHE

답변

4

STAFHandle.__init__ 반환 None. 당신은 아마 원하는 :

class Handle(STAFHandle): 
    def __init__(self, handle_name): 
     super(Handle, self).__init__(handle_name) 
     self.initLogger() 

    def initLogger(self): 
     self.logger = Logging(self, 'Test') 

handle = Handle('test') 

__init__ 방법은 자신의 첫 번째 인수로 대상을 기억하고, 개체을 수정합니다. 따라서 super(Handle, self).__init__(handleName)을 호출하면 새 객체를 반환하는 대신 self의 속성이 변경됩니다. 두 예제의 차이는 에 대한 두 번의 호출에서 변수 handle이 다른 것을 참조한다는 것입니다.

STAFHandle.__init__ 호출을 super 프록시로 바꿨습니다. 이 경우에는 동등하지만 더 유연하게 사용할 수 있습니다. __init__을 깨지 않고 클래스의 상속을 변경할 수 있기 때문입니다.

또한 HandleNamehandle_name으로 변경하여 Python 규칙을 준수합니다 (CamelCase는 클래스를 참조 함).

+0

의견을 보내 주셔서 감사합니다. 사실이 방법을 먼저 시도했지만 다른 오류가 발생했습니다. TypeError : super() 인수 1은 classobj가 아닌 형식이어야합니다. –

+0

@Zhe : 기본 클래스는 "구식"입니다. 그것은 '객체'에서 파생되지 않습니다. 새로운 유형 계층 구조에서는 모든 클래스가 그렇게해야합니다. 일단 그것을 변경하면 모든 것이 효과가있다. – katrielalex

관련 문제