2017-09-08 6 views
0

나는 내가 클래스 C 의 super().drawRect() 함수가 자동으로 <__main__.C object at 0x0000023D99FA6748> 전송 호출 할 때 나는 그를 낸파이썬 클래스 호출 슈퍼의 방법 대신 상속

class A: 
    def __init__(self): 
     self.window = "<I am window class>" 

class B(A): 
    def __init__(self): 
     super().__init__() 

    def createObject(self): 
     print(self.window) # it works here 
     self.c = C() 

    def drawRect(self): 
     print(self.window) # does not work when called from class C 

class C(B): 
    def __init__(self): 
     self.draw() 

    def draw(self): 
     super().drawRect() 

app = B() 
app.createObject() 

다음과 같은 문제를 가지고있다.

가 어떻게 기능 무승부() 나는 B 클래스 자체에서 함수를 호출 할 때 내가 비 단순화 된 코드로 인해 요구하고있는 super().drawRect()

<__main__.B object at 0x0000017A2BA95358>를 보낼에, 클래스 C를 만들 수 있습니다, 그것은 자기를 인쇄 .window하지만 C 클래스에서 호출하면 아무 것도 출력되지 않습니다.

이 문제를 어떻게 해결할 수 있습니까? 내가 뭘 잘못 했니? 당신이 C의 인스턴스를 만들 때

답변

1

B에서 상속하는 일에만 C 인스턴스가, 더 B 개체가 없습니다.

그래서 귀하의 질문에 대한 대답 : 기능 draw()에서 내가 클래스 C를 만들 수있는 방법

super().drawRect()

<__main__.B object at 0x0000017A2BA95358>을되어 보내 : 당신은 할 수 없습니다.

C 개체와 함께 B 개체를 새로 만들 수 있지만 상속의 목적을 무시할 수 있습니다.

는하지만 그냥 C.__init__super().__init__를 호출해야하는 것이 더욱 합리적으로 보인다

class C(B): 
    def __init__(self): 
     super().__init__() 
     self.draw() 

    def draw(self): 
     super().drawRect() 

어쨌든 할 수 없습니다 이상한 것입니다. 상속은 일종의 이 아닌을 완전히 오버으로 확장한다는 것을 의미합니다.

그러나

당신이 당신의 B.createObject 방법에 self.c = C()을하고 있다는 사실 주어진 당신은 아마 다른 방법을 파악해야한다 B에서 C 상속 (예 composition)를 대신 상속 :

class A: 
    def __init__(self): 
     self.window = "<I am window class>" 

class B(A): 
    def __init__(self): 
     super().__init__() 

    def createObject(self): 
     print(self.window) # it works here 
     self.c = C(self) 

    def drawRect(self): 
     print(self.window) # does not work when called from class C 

class C(object): # don't inherit from B 
    def __init__(self, obj): 
     self.obj = obj 
     self.draw() 

    def draw(self): 
     self.obj.drawRect() 

app = B() 
app.createObject() 

그러나이 기준주기를 생성합니다 인스턴스를 B 인스턴스의 속성으로, B 인스턴스를 C 인스턴스의 속성으로 저장했기 때문입니다. 또한 코드를 너무 단순화하여 실제 코드가 어떤 방식 으로든 구성을 방해 할 수도 있습니다. 그러나 B에서 상속받은 것처럼 보이는 현재 코드는 B의 동작을 완전히 무시하고 그 속성을 사용하지 않기 때문에 클래스 C에 대한 나쁜 생각입니다.이 메서드는 속성을 사용하지 않기 때문에 (어쨌든 메서드를 재정의 할 수는 없습니다.)

0

당신은

찰리

클래스 C 생성자에서

super().__init__() 

에 호출 할 필요가