2014-03-28 2 views
0

나는 예를 들어 내가파이썬에서 클래스를 올바르게 확장하고 부모 클래스를 사용하는 방법은 무엇입니까?

client = Client(wsdl, username = USERNAME, password = PASSWORD, headers = {'Content-Type': 'application/soap+xml'}, plugins = [VapixHelper()]) 

rules = client.service.GetActionRules() 

을 잘 작동 그래서 나는 그래서 그것을 수행하려고이 클래스에 대한 몇 가지 여분의 방법을 추가 할 필요가 간단한 코드를 ... SUDS 모듈에서 클래스 Client을 확장 할 필요가 이 같은 :

class Vapix(Client): 
    def __init__(self, args): 
     globals().update(vars(args)) 
     USERNAME, PASSWORD = user_data.split(':') 
     super(Vapix, self).__init__(wsdl, username = USERNAME, password = PASSWORD, headers = {'Content-Type': 'application/soap+xml'}, plugins = [VapixHelper()]) 

    def setActionStatus(self, status): 
     print super(Vapix, self).service.GetActionRules() 

그리고 내가 대신 결과이 오류를 얻을 :

Traceback (most recent call last): 
    File "vapix.py", line 42, in <module> 
    client.setActionStatus(True) 
    File "vapix.py", line 36, in setActionStatus 
    print super(Vapix, self).service.GetActionRules() 
AttributeError: 'super' object has no attribute 'service' 
+3

그냥'self.service'를 사용하십시오. – BrenBarn

+0

@BrenBarn nice, thanks ... 부모 클래스를 호출해야 할 때'super (Vapix, self)'와'self'의 차이점은 무엇인가? – Kin

+1

http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods – icedtrees

답변

2

당신은 무시되지 않습니다 a service() 방법이므로 원래 방법을 찾으려면 super()을 사용할 필요가 없습니다. ,

def setActionStatus(self, status): 
    print self.service.GetActionRules() 

super() 만 필요 당신이하는 방법 (또는 다른 설명 개체)에 대한 (방법 해상도 ​​위해 MRO) 기본 클래스를 검색해야하는 경우 다음 super() 호출을 제거하고 대신 직접 self의 속성에 액세스 종종 현재 클래스가 그 이름을 다시 정의했기 때문입니다. 당신이 기본 클래스 foo를 호출해야하지만, 현재의 클래스가 foo 방법을 구현하는 경우

, 당신은 self.foo()을 사용할 수 없으며 대신 super()를 사용해야합니다. 예를 들어 이고 super()__init__입니다. 파생 클래스는 자신의 __init__ 방법이 있으므로 super()는 다음 __init__ 방법을 가지고 다음 수업을 찾고 간다, 그 순서에 Vapix을 발견, self의 MRO에 보이기 때문에 self.__init__()를 호출하면 반복적으로 같은 메소드를 호출하지만, super(Vapix, self).__init__() 일 것입니다.

여기서 service인스턴스 속성입니다. 그것은 self에 직접 정의되어 있으며 심지어 방법이 아닙니다.

+0

그래, 이미 이해가 ... 당신의 대답에 하나의 움직임 ... 부모 방법을 무시하고 싶다면 어떻게해야합니까? – Kin

+1

@Kirix : * then * 메소드의 이름을 똑같이 지정하고'super()'를 사용하여 부모 메소드를 여전히 호출합니다. –

관련 문제