기본 (수퍼) 클래스를 어떻게 초기화합니까?
class SuperClass(object):
def __init__(self, x):
self.x = x
class SubClass(SuperClass):
def __init__(self, y):
self.y = y
super
메서드 확인 순서에서 다음 메서드를 바인딩 된 메서드로 가져 오려면 개체를 사용하십시오 . Python 2에서는 self
바인딩 된 __init__
메서드 를 조회하려면 클래스 이름과 super를 전달해야합니다 .
class SubClass(SuperClass):
def __init__(self, y):
super(SubClass, self).__init__('x')
self.y = y
Python 3에는 인수를 super
불필요하게 만드는 약간의 마술이 있습니다. 부수적으로 조금 더 빠르게 작동합니다.
class SubClass(SuperClass):
def __init__(self, y):
super().__init__('x')
self.y = y
아래와 같이 부모를 하드 코딩하면 협력 다중 상속을 사용할 수 없습니다.
class SubClass(SuperClass):
def __init__(self, y):
SuperClass.__init__(self, 'x') # don't do this
self.y = y
__init__
반환 만None
할 수 있다는 점에 유의하십시오 -제자리에서 객체를 수정하기위한 것입니다.
어떤 것 __new__
인스턴스를 초기화하는 또 다른 방법이 있습니다. 이것은 파이썬에서 불변 유형의 서브 클래스를위한 유일한 방법입니다. 당신이 서브 클래스에 원하는 경우에 따라서는 필요한 것 str
또는 tuple
또는 다른 불변의 객체입니다.
암시 적 클래스 인수를 가져 오기 때문에 클래스 메서드라고 생각할 수 있습니다. 그러나 실제로는 staticmethod 입니다. 그래서 당신은 전화를 필요 __new__
로 cls
명시 적으로.
일반적으로에서 인스턴스를 반환 __new__
하므로이 경우 기본 클래스에서도 기본을 __new__
통해 호출해야합니다 super
. 따라서 두 가지 방법을 모두 사용하는 경우 :
class SuperClass(object):
def __new__(cls, x):
return super(SuperClass, cls).__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super(SubClass, cls).__new__(cls)
def __init__(self, y):
self.y = y
super(SubClass, self).__init__('x')
Python 3 __new__
은 정적 메서드로 인해 발생하는 수퍼 호출의 이상 함을 약간 회피 하지만 여전히 cls
바인딩되지 않은 __new__
메서드 로 전달해야합니다 .
class SuperClass(object):
def __new__(cls, x):
return super().__new__(cls)
def __init__(self, x):
self.x = x
class SubClass(object):
def __new__(cls, y):
return super().__new__(cls)
def __init__(self, y):
self.y = y
super().__init__('x')