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方法会被调用到吗? 是怎么调用的呢?
먼저 여기에 오류가 있습니다.
질문자는 새로운 스타일의 클래스인A
클래스의r1=fun()
문장에 문제가 있어서r1=self.fun()
이어야 하는데super
키워드를 사용했기 때문에A
은 새로운 스타일의 클래스여야 합니다. 요약하면**Python2**
에 있으면A
의 전체 정의는 다음과 같습니다. 으아악을 사용했기 때문에 작성 방법이 약간 다를 것입니다.
이 세 클래스의 최상위 부모 클래스는Python3
는A
을 적극적으로 상속받을 필요가 없습니다.object
그리고클래스에 큰따옴표가 빠졌네요...
C
이고,
클래스 생성 시 자동으로 실행되는 메소드입니다. :A
은B
에서 상속되고,A
은C
에서 상속됩니다.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()