2011-10-22 2 views
10

이 코드는 예외를 throw합니다. AttributeError, "wtf!" A.foo()B.foo1()으로 전화를 걸었으므로A.foo1()으로 전화하지 않아야합니까? 내가 A.foo1() 전화를 강제 할 수있는 방법 그것은 프로그래밍 언어가 작동 세계의 100 %로, 의도 한대로 작동오버라이드 된 메서드 호출, 오버라이드 된 메서드 호출 수퍼 클래스

class A(object): 
    def foo(self): 
     print self.foo1() 

    def foo1(self): 
     return "foo" 

class B(A): 
    def foo1(self): 
     raise AttributeError, "wtf!" 

    def foo(self): 
     raise AttributeError, "wtf!" 

    def foo2(self): 
     super(B, self).foo() 

myB = B() 
myB.foo2() 
+1

기본적으로 파이썬이 동적 성 및 가상 메소드를 버리고, 어쨌든 함수가 어휘 적으로 정의 된 위치를 기반으로 속성 룩업 체인의 일부를 건너 뛰도록 요구하고 있습니다. 그런 일은 없을 것이다. – delnan

답변

5

(그리고 A.foo() 내부에 메서드 호출 A.*를 호출해야합니다). 서브 클래스는 부모 클래스의 모든 메소드를 오버라이드 (override)합니다.

그러나 실제로는 A.foo1()을 호출하려는 경우 이와 같이 할 수 있습니다 (보증 할 수 없음). 그리고 좋은 프로그래밍의 모든 원칙에 위배되기 때문에 어떤 경우에도 이것을해서는 안됩니다. 코드의

class A(object): 

    def foo(self): 
     A.foo1(self) 
2

은 : (A)로부터 유도되는 방법은 그것의 이름 공간을 찾기 시작한다 B의 인스턴스를 호출 할 때

def foo2(self): 
    super(B, self).foo() 

자기 B.

의 인스턴스 B와 메소드가 발견되지 않는 경우에만 (예 : B에 의해 대체되지 않음) A에서 구현이 사용되지만 항상 B를 참조하여 자체를 참조하십시오.

6

인 클래스 A 대신 self 메서드를 호출하면 A 메서드를 호출하고 self을 수동으로 전달해야합니다.

일반적인 일은 아니지만 은 정말과 같이해야합니다.

class A(object): 
    def foo(self): 
     print A.foo1(self) 

    def foo1(self): 
     return "foo" 

class B(A): 
    def foo1(self): 
     raise AttributeError, "wtf!" 

    def foo(self): 
     raise AttributeError, "wtf!" 

    def foo2(self): 
     super(B, self).foo() 

myB = B() 
myB.foo2() 
-1

파이썬이 여기에서 무엇을하는지 볼 수 있지만 무시 방식은 약간 극단적입니다. 클래스 A가 100 개의 속성을 정의하고 클래스 B가 이들을 계승하고 1 개의 추가 속성을 추가하는 경우를 생각해보십시오. B에 대한 __init __()를 A에 대해 __init __()를 호출하고 B의 코드에서 단일 속성 만 정의하도록 할 수 있기를 원합니다. 비슷하게 A에 reset() 메서드를 정의하여 모든 속성을 0으로 설정하면 B에 해당하는 reset() 메서드는 A에 대해 reset() 메서드를 호출 한 다음 단일 B 특성을 대신 0으로 처리 할 수 ​​있어야합니다. A의 모든 코드를 복제해야한다는 것입니다. 파이썬은 객체 지향 프로그래밍의 주요 장점이라고 생각되는 것을 어렵게 만들고 있습니다. 즉, 코드 재사용. 여기서 가장 좋은 옵션은 우리가 실제로 재사용하고 싶은 메소드를 무시하는 것입니다.

class X(object): 
    def __init__ (self): 
     print "X" 
     self.x = 'x' 
     self.reset() 
     print "back to X" 
    def reset (self): 
     print "reset X" 
     self.xx = 'xx' 

class Y(X): 
    def __init__ (self): 
     print "Y" 
     super(Y,self).__init__() 
     self.y = 'y' 
     self.reset() 
     print "back to Y" 
    def reset (self): 
     print "reset Y" 
     super(Y,self).reset() 
     print "back to reset Y" 
     self.yy = 'yy' 

aY = Y() 

(클래스 Y.에 대한 __init의 __에서 self.reset()() 호출을 제거, 제대로이 일을하려면)

: 여기 파이썬과 합병증의 감각을 얻고 싶은 경우에,이 코드를 시도