2017-02-21 3 views
1

한다고 가정 클래스 A B에서 상속되고 B는 질문 어떻게 파이썬

class C(): 
    def my_method(self): 
     pass 

class B(C): 
    def my_method(self): 
     pass 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # How can I call my_method from C here ? 

C.

에서 상속에서 객체의 조상에 액세스합니다 : 어떻게 C에서 my_method를 호출 할 수 있습니다?

+0

당신은'SomeClass'의 부모 클래스를 의미? – Dschoni

+0

[XY 문제] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)와 비슷합니다. 일반적으로 특정 조상에 액세스 할 필요는 없으며 액세스 할 수있는 사람을 '슈퍼'로 지정하면 [MRO] (메소드 확인 순서)에 대한 전체적인 내용이됩니다. (https://www.python.org/download /releases/2.3/mro/). – MSeifert

+0

'A()'로 생성 된 객체는 하나뿐입니다. 이 객체는 모든 수퍼 클래스의 인스턴스이지만 부모 클래스에 대해 만들어진 개별 객체 세트는 없습니다. – kazemakase

답변

1

당신은 단순히 인수로 전달 self로 직접 "언 바운드"메서드를 호출하여 Cmy_method() 메서드를 호출 할 수 있습니다. 예를 들면 다음과 같습니다합니다 ((object)이 파이썬 2.x에서 작업하는 super() 필요 주) 다음을 인쇄합니다

class C(object): 
    def my_method(self): 
     print('C.my_method') 

class B(C): 
    def my_method(self): 
     print('B.my_method') 

class A(B): 
    def my_method(self): 
     print('A.my_method') 
     super(A, self).my_method() # calls B.my_method(self) 
     C.my_method(self)   # calls C.my_method(self) 

a = A() 
a.my_method() 

실행 :

A.my_method 
B.my_method 
C.my_method 

그러나, 다른 사람들이 지적으로, 이것은 당신이 원하는 것을 성취하는 최선의 방법이 아닐 수도 있습니다. 문맥에서 달성하고자하는 것에 대한 구체적인 예를들 수 있습니까? 당신이 최고 기능을 사용하고자하는 모든 경우의

+0

사실, 클래스 A의 my_method를 오버라이드하고 싶습니다. 즉, 클래스 B가 아닌 클래스 C의 my_method에 몇 가지 기능을 추가 할 것입니다. –

0

당신은 __mro__ 속성을 사용하여 객체의 전체 가계에 액세스 할 수 있습니다

In [3]: KeyError.__mro__ 
Out[3]: (KeyError, LookupError, StandardError, Exception, BaseException, object) 
0

먼저 다음은 파이썬의 새로운 스타일의 프로그램에서이

class c(object): 
    pass 

때문에 슈퍼 기능 지원과 같은 개체로 기본 클래스를 사용해야합니다.

이제 기본 클래스의 기본 클래스의 함수에 액세스하는 방법이 있습니다. 귀하의 경우 A.에서 클래스 C의 my_method 함수를 호출하는 방법

정적 및 동적 두 가지 방법으로이 작업을 수행 할 수 있습니다. 내가 0 번째 인덱스를했다 왜

동적으로 여기

class C(object): 
    def my_method(self): 
     print "in function c" 

class B(C): 
    def my_method(self): 
     print "in function b" 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # This is how you can call my_method from C here ? 
     super((self.__class__.__bases__)[0], self).my_method() 
obj_a = A() 
obj_a.my_method() 

(self.__class__.__bases__)는 튜플 형 이잖아에서의 기본 클래스를 반환합니다. 따라서 B 클래스를 반환하므로 B 클래스를 인수로 사용하여 b 클래스의 기본 클래스 인 my_method 함수를 반환합니다.

는 정적

class C(object): 
    def my_method(self): 
     print "in function c" 

class B(C): 
    def my_method(self): 
     print "in function b" 

class A(B): 
    def my_method(self): 
     # Call my_method from B 
     super(A, self).my_method() 
     # This is how you can call my_method from C here ? 
obj_a = A() 
super(A,obj_a).my_method() # calls function of class B 
super(B,obj_a).my_method() # calls function of class A