2011-10-20 2 views
13

기본 클래스의 메서드를 상속 된 클래스의 재정의하는 메서드 대신 동일한 클래스의 다른 메서드를 호출 할 싶습니다. 다음 코드는상속 및 기본 클래스 메서드 호출 파이썬

클래스 B를 출력하고 싶은 : 6 개

클래스 A : 9

가이 작업을 수행 할 수 있습니까? http://docs.python.org/tutorial/classes.html#private-variableshttp://docs.python.org/reference/expressions.html#atom-identifiers에서 :


# Base class definition 
class ClassA(object): 
    def __init__(self): 
     print("Initializing A") 

    # hoping that this function is called by this class's printFnX 
    def fnX(self, x): 
     return x**2 

    def printFnX(self, x): 
     print("ClassA:",self.fnX(x)) 

# Inherits from ClassA above 
class ClassB(ClassA): 
    def __init__(self): 
     print("initizlizing B") 

    def fnX(self, x): 
     return 2*x 

    def printFnX(self, x): 
     print("ClassB:", self.fnX(x)) 
     ClassA.printFnX(self,x) 

bx = ClassB() 
bx.printFnX(3) 
+10

어떤 대답을 허용으로 표시했는지 다시 생각해 보시나요? 현재 선택은 대부분의 사람들과 대부분의 유스 케이스에 대한 나쁜 조언이다. –

답변

-3

두 클래스 방법을 모두 동일하게 만들 수 있습니다. fnXprintFnX 두 클래스 방법.

class ClassA(object): 

    def __init__(self): 
     print("Initializing A") 

    # hoping that this function is called by this class's printFnX 
    @classmethod 
    def fnX(self, x): 
     return x ** 2 

    @classmethod 
    def printFnX(self, x): 
     print("ClassA:",self.fnX(x)) 

class ClassB(ClassA): 
    def __init__(self): 
     print("initizlizing B") 

    def fnX(self, x): 
     return 2*x 

    def printFnX(self, x): 
     print("ClassB:", self.fnX(x)) 
     ClassA.printFnX(x) 


bx = ClassB()<br> 
bx.printFnX(3) 
+0

이것은 다른 대답보다 ... 더 우아합니다. 감사. – fodon

+5

이것은 작동하지 않습니다. fnX 내부에서''self.y''와 같은 인스턴스 변수에 접근하려고 시도하십시오. 클래스 메소드에서 * self * 변수는 더 이상 인스턴스를 보유하지 않습니다. 대신 호출자 인스턴스의 클래스가되므로 인스턴스 변수에 대한 액세스 권한을 완전히 잃어버린 것입니다. 이 "패턴"은 재앙이며 신경 써야 할 코드에 사용해서는 안되는 것입니다. –

+0

나는 그것이 방금 설명한 모든 단점을 가지고 그의 원래 질문에 대답했다는 것에 동의한다. 여기에는 패턴이 없습니다. –

49

축하합니다, 당신은

세부 사항과 근무 아웃의 예를 참조하십시오

:-) 엉망으로 파이썬의 이중 밑줄 이름에 대한 동기 부여 유스 케이스를 발견했습니다.

는 여기에 귀하의 예를 들어 그것을 사용하는 방법은 다음과 같습니다

# Base class definition 
class ClassA(object): 
    def __init__(self): 
     print("Initializing A") 

    # hoping that this function is called by this class's printFnX 
    def fnX(self, x): 
     return x**2 
    __fnX = fnX 

    def printFnX(self, x): 
     print("ClassA:",self.__fnX(x)) 

# Inherits from ClassA above 
class ClassB(ClassA): 
    def __init__(self): 
     print("initizlizing B") 

    def fnX(self, x): 
     return 2*x 

    def printFnX(self, x): 
     print("ClassB:", self.fnX(x)) 
     ClassA.printFnX(self,x) 

bx = ClassB() 
bx.printFnX(3) 

을 사용하는 경우가 http://www.youtube.com/watch?v=yrboy25WKGo&noredirect=1에서 발견 "서브 클래스의 예술"의 Open-Closed Principle을 구현하는 방법으로 설명되어 있습니다.

+1

매우 통찰력이 있습니다. 이제 방법의 이중 밑줄 명명법이 유용하다는 것을 알고 있습니다! –

+0

명백하지 않은 것은 기본 클래스의 메서드가 public이어야하거나 완전히 변형 된 이름을 사용해야한다는 것입니다. 파이썬에는 "보호 된"또는 "친구"한정자가 없으므로 슈퍼 클래스에서 기본 클래스로 'def __doSomething (self) :'을 단순히 리팩토링하면 상위 클래스에서 액세스 할 수 없습니다. 당신은 그것을 공개'def doSomething (self) : "해야하거나 맹 글링 된 이름을 사용해야합니다. –

관련 문제