2017-04-07 1 views
1

나는 다음과 같이 파이썬에서 두 개의 클래스가 있다고 가정

class Parent(object): 
    def __init__(self): 
     self.num = 0 

    def fun1(self): 
     print 'p.fun1' 

    def fun2(self): 
     self.fun1() 
     print 'p.fun2' 

from parent import Parent 

class Child(Parent): 
    def __init__(self): 
     super(Child,self).__init__() 

    def fun1(self): 
     print 'c.fun1' 

    def fun2(self): 
     super(Child, self).fun2() 
     print 'c.fun2' 

내가

from child import Child 

test = Child() 
test.fun2() 
아이

fun2를 호출하는 경우

출력이 표시됩니다.

c.fun1 
p.fun2 
c.fun2 

Child.fun2()의 전화가 Parent.fun2()으로 이어지는 것을 의미합니다. 그러나 Parent.fun2() 안에는 self.fun1()을 사용합니다.이 경우에는 내 테스트에서 Child.fun1()으로 해석됩니다.

하지만 실제로는 클래스 Parent을 개인으로 지정하고 Parent.fun2()은 항상 Parent.fun1()을 사용하고 싶습니다.

어떻게 이것을 피할 수 있습니까?

Parent.__fun1()Parent.fun1() 비공개로 설정할 수 있음을 알고 있습니다. 그러나 나는 Parent의 몇 가지 경우를 가지고 있는데이 부분 외부에서 Parent.fun1()을 사용해야합니다. 즉, 실제로 fun1()을 재정의해야한다는 의미입니다.

+0

당신이 의미하는 것이 약간 명확하지 않습니다. Parent 인스턴스는 항상 Parent.fun1을 호출하고 Child 인스턴스는 항상 Child.fun1을 호출합니다. –

+0

불만을해서 죄송합니다. 나는 그것을 원한다.'Parent' 클래스에서'self.fun1()'의 사용은'Parent.fun1()'만 참조하면된다. 내 테스트에서'Child'의 인스턴스를 생성했기 때문에'Child.fun2()'를 사용하면'Parent.fun2()'로 연결됩니다. 그리고'Parent.fun2()'에 대한이 호출은 Child.fun1()을 호출하지만,'Parent.fun1()'을 호출하기를 원합니다. 출력 결과가'p.fun1 p.fun2 c.fun2'이되기를 바랍니다. – zXu

+1

그러면 왜 'fun1'을 하위 클래스에 구현합니까? – jonrsharpe

답변

1

상속이 어떻게 작동하는지 생각해보십시오. 필요한 동작에 대해서는 Parent & Child 클래스의 관계를 재검토하거나 메서드 이름을 변경하거나 적어도 Parent 메서드 classmethods 또는 staticmethods을 만들 수 있습니다.

필요에 따라 작동하지만 실제로는 좋지 않습니다.

class Parent(object): 
    def __init__(self): 
     self.num=0 
    def fun1(self): 
     print 'p.fun1' 
    def fun2(self): 
     Parent.fun1(self) 
     print 'p.fun2' 

Child 클래스는 동일하게 유지 될 수 있습니다.

self은 상속 체인에서 액세스하는 모든 클래스에서 항상 super 호출 (또는 해당 메소드의 메소드/속성을 찾으려면)에 액세스 한 현재 클래스가 아니라 실제로 인스턴스화 된 클래스의 인스턴스를 가리 킵니다. 따라서 self.fun2은 항상 Child 클래스의 메서드를 가리 킵니다.

+0

답장을 보내 주셔서 감사합니다!나를 위해 훨씬 더 분명하다;) – zXu