python继承调用问题
迷茫
迷茫 2017-04-17 17:39:55
0
1
284

class A:

def __init__(self):
    r1=fun()
def fun(self):
    raise NotImplementedError

class B(A):

def __init__(self):
    super(B,self).__init__()
def fun(self):
    print("fun in B")

class C(B):

def __init__(self):
    super(C,self).__init__()
def fun(self):
    print("fun in C)

c=C()

这里会初始化一个C实例,然后在C中会调用B的init 方法,然后在B的init方法中调用A的init方法,但是在A的init方法中会有个fun的方法是 raise NotImplementedError 是什么意思?这个函数是什么作用?然后在实例化C的过程中会调用到A中的fun方法吗?然后B和C中的fun方法会被调用到吗? 是怎么调用的呢?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

모든 응답(1)
伊谢尔伦

먼저 여기에 오류가 있습니다. A 클래스의 r1=fun() 문장에 문제가 있어서 r1=self.fun()이어야 하는데 super 키워드를 사용했기 때문에 A은 새로운 스타일의 클래스여야 합니다. 요약하면 **Python2**에 있으면 A의 전체 정의는 다음과 같습니다. 으아악

질문자는 새로운 스타일의 클래스인

을 사용했기 때문에 작성 방법이 약간 다를 것입니다. Python3A을 적극적으로 상속받을 필요가 없습니다. object그리고
클래스에 큰따옴표가 빠졌네요...C

이 세 클래스의 최상위 부모 클래스는

이고, AB에서 상속되고, AC에서 상속됩니다. B
은 다른 언어의 생성자와 약간 유사하게 작동하지만 __init__()의 기능은 다음과 같이 이해할 수 있습니다. __init__()

클래스 생성 시 자동으로 실행되는 메소드입니다.

그래서
:

의 인스턴스를 생성하면 이 클래스가 생성될 때 A 문장이 자동으로 실행됩니다. 즉, a=A() 메서드가 실행되고 r1=fun()가 실행됩니다. 한 문장은 fun() 예외를 발생시킨다는 의미입니다. raise NotImplementedError NotImplementedError

하지만

.

클래스의 인스턴스를 생성하면 프로그램이 예외를 발생시키지 않고

만 출력하는 것을 볼 수 있습니다. C fun in C

왜요?

주제의 코드에서 상위 클래스의
메서드는 자동으로 실행되지 않습니다. 여기서

키워드는 상위 클래스의 __init__() 메서드를 강제로 실행하도록 합니다. > 메소드 문장을 삭제하면(super 또는 __init__()에서 임의의 문장 삭제) super 문장이 더 이상 출력되지 않는 것을 확인할 수 있습니다. 이는 또한 상위 클래스의 C 메소드가 출력되지 않음을 증명합니다. 자동으로 실행됩니다. B fun in C이 현상의 원인은 다음과 같습니다. __init__() 하위 클래스가 상위 클래스의 메서드에 액세스하면 하위 클래스의 인스턴스를 생성할 때 하위 클래스에 작성된 내용이 실행됩니다. 부모 클래스의 메서드가 재정의되지 않은 경우 프로그램에서 하위 클래스 인스턴스를 사용하여 메서드를 호출하면 부모 클래스의 메서드가 호출됩니다.

覆盖/覆写(overwrite)

클래스 모두

메서드를 계층별로 다루므로 C 클래스의 B 문장이 최종적으로 호출됩니다. 꽤 __init__() 메소드에서 A가 실행되고, r1 = self.run() 클래스가 C 메소드를 덮고 있기 때문에, 이 문장은 실제로 __init__() 클래스의 r1 = self.run() 메소드를 실행하여 C을 출력합니다. 예외를 발생시키는 대신. run()

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿