파이썬에서 슈퍼 생성자를 호출하는 방법?
class A:
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
B() # output: hello
다른 모든 언어에서는 수퍼 생성자를 사용하여 암시 적으로 호출됩니다. 파이썬에서 어떻게 호출합니까? 나는 기대 super(self)
하지만 이것은 작동하지 않습니다.
super()
새로운 스타일의 클래스에서 부모와 같은 객체 를 반환합니다 .
class A(object):
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
super(B, self).__init__()
B()
다른 답변과 함께 수퍼 클래스 메소드 (생성자를 포함)를 호출하는 여러 가지 방법이 있지만 Python-3.x에서는 프로세스가 단순화되었습니다.
파이썬 -2.x
class A(object):
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
super(B, self).__init__()
파이썬 -3.x
class A(object):
def __init__(self):
print("world")
class B(A):
def __init__(self):
print("hello")
super().__init__()
super()
이제 문서에super(<containing classname>, self)
따라 동일합니다 .
Python 2.x 구식 클래스를 사용하면 다음과 같습니다.
class A:
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
A.__init__(self)
한 가지 방법은 A의 생성자를 호출하고 다음과 self
같이 인수로 전달 하는 것입니다.
class B(A):
def __init__(self):
A.__init__(self)
print "hello"
이 스타일의 장점은 매우 명확하다는 것입니다. A를 이니셜 라이저라고합니다. 단점은 공유 기본 클래스의 이니셜 라이저를 두 번 호출 할 수 있기 때문에 다이아몬드 모양의 상속을 잘 처리하지 못한다는 것입니다.
다른 방법은 다른 사람들이 보듯이 super ()를 사용하는 것입니다. 단일 상속의 경우 기본적으로 부모의 이니셜 라이저를 호출하는 것과 동일한 기능을 수행합니다.
그러나 super ()는 상당히 복잡하고 여러 상속 상황에서 반 직관적 일 수 있습니다. 더하기 측면에서는 super ()를 사용하여 다이아몬드 모양의 상속을 처리 할 수 있습니다. super ()가하는 일에 대한 핵심 내용을 알고 싶다면 super ()의 작동 방식에 대해 찾은 최고의 설명이 여기에 있습니다 (필자 는 해당 기사의 의견을 반드시 보증하는 것은 아닙니다).
짧은 답변
super(DerivedClass, self).__init__()
긴 답변
무엇을 super()
합니까?
지정된 클래스 이름을 취하고 기본 클래스를 찾은 후 (Python은 다중 상속을 허용 함) __init__
왼쪽에서 오른쪽으로 각 메소드를 찾습니다 ( 이 경우). 사용 가능한 메소드를 찾으면이를 호출하고 검색을 종료합니다.
모든 기본 클래스의 init를 어떻게 호출합니까?
위의 기본 클래스가 하나만있는 경우 작동합니다. 그러나 파이썬은 다중 상속을 허용하므로 모든 기본 클래스가 올바르게 초기화되도록 할 수 있습니다. 그렇게하려면 각 기본 클래스 호출을 초기화해야합니다.
class Base1:
def __init__():
super(Base1, self).__init__()
class Base2:
def __init__():
super(Base2, self).__init__()
class Derived(Base1, Base2):
def __init__():
super(Derived, self).__init__()
슈퍼를 위해 init를 호출하는 것을 잊어 버리면 어떻게합니까?
생성자 ( __new__
)는 체인에서 호출됩니다 (C ++ 및 Java 에서처럼). 인스턴스가 생성되면 __init__
해당 슈퍼 클래스에 대한 암시 적 체인없이 해당 인스턴스의 이니셜 라이저 ( ) 만 호출됩니다.
매개 변수가있는 예제를 추가하기 만하면됩니다.
class B(A):
def __init__(self, x, y, z):
A.__init__(self, x, y)
변수 x, y, z를 정의해야하는 파생 클래스 B와 x, y를 정의해야하는 수퍼 클래스 A가 주어지면 현재 서브 클래스 인스턴스를 참조하여 수퍼 클래스 A 의 정적 메소드 init 를 호출 할 수 있습니다. (자체) 그리고 예상 인수 목록.
이전 답변을 확장하는 다음 공식을 사용합니다.
class A(object):
def __init__(self):
print "world"
class B(A):
def __init__(self):
print "hello"
super(self.__class__, self).__init__()
B()
이렇게하면 super 호출에서 클래스 이름을 반복 할 필요가 없습니다 . 많은 수의 클래스를 코딩하고 클래스 이름과 독립적으로 이니셜 라이저 메소드의 코드를 작성하려는 경우 유용 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/2399307/how-to-invoke-the-super-constructor-in-python
'Programing' 카테고리의 다른 글
간격이 동일한 DIV의 유체 폭 (0) | 2020.03.07 |
---|---|
파일 입력 'accept'속성-유용합니까? (0) | 2020.03.07 |
봉인 된 특성은 무엇입니까? (0) | 2020.03.07 |
Ruby의 문자열 보간에 해당하는 Python이 있습니까? (0) | 2020.03.07 |
다른 지점으로 커밋 푸시 (0) | 2020.03.07 |