기본 (슈퍼) 클래스를 초기화 초기화?
여기서는 다음 코드가 생각하십시오.
>>> class SuperClass(object):
def __init__(self, x):
self.x = x
>>> class SubClass(SuperClass):
def __init__(self, y):
self.y = y
# how do I initialize the SuperClass __init__ here?
SuperClass __init__
하위 클래스에서를 어떻게 초기화하나요? 나는 스키마를 사용하고 그것을 그것을 다루지 않습니다. Google에서 검색 할 때 여러 가지 방법을 찾았습니다. 관리 처리하는 표준 방법은 무엇입니까?
Python (버전 3까지)은 "이전 스타일"및 새로운 스타일 클래스를 지원합니다. 새로운 스타일의 클래스에서 파생 된 object
당신은 무엇을 사용하고,이를 통해 자신의 기본 클래스 호출 super()
, 예를 들어,
class X(object):
def __init__(self, x):
pass
def doit(self, bar):
pass
class Y(X):
def __init__(self):
super(Y, self).__init__(123)
def doit(self, foo):
return super(Y, self).doit(foo)
기본 메소드는 구식 클래스와 새로운 스타일 클래스에 대해 알고 있기 때문에 기본 메소드를 호출하는 여러 가지 방법이 있으므로 여러 가지 방법을 찾았습니다.
완전성을 위해 구식 클래스는 기본 클래스를 사용하여 기본 메소드를 명시 적으로 호출합니다.
def doit(self, foo):
return X.doit(self, foo)
더 이상 구식을 사용하지 않습니다. 너무 신경 쓰지 않을 것입니다.
콘센트 3은 새로운 스타일의 클래스에 알고 object
있습니다.
양자 모두
SuperClass.__init__(self, x)
또는
super(SubClass,self).__init__( x )
작동합니다 (DRY 원칙을 더 준수하기 때문에 두 번째 것을 선호합니다).
여기를 참조하십시오 : http://docs.python.org/reference/datamodel.html#basic-customization
Python 3.5.2부터 다음을 사용할 수 있습니다.
class C(B):
def method(self, arg):
super().method(arg) # This does the same thing as:
# super(C, self).method(arg)
https://docs.python.org/3/library/functions.html#super
기본 (슈퍼) 클래스를 초기화 초기화?
class SuperClass(object): def __init__(self, x): self.x = x class SubClass(SuperClass): def __init__(self, y): self.y = y
super
메소드 분석 순서에서 다음 메소드 (바운드 메소드로)를 확보 오브젝트를 사용하십시오 . 파이썬이 클래스 이름을에서는 전달 self
하고 바인딩 된 __init__
메서드 를 조회하려면 슈퍼를 사용해야합니다 .
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')
참고 URL : https://stackoverflow.com/questions/3694371/how-do-i-initialize-the-base-super-class
'IT' 카테고리의 다른 글
C ++에서 "X는 형식을 지정하지 않습니다"오류 (0) | 2020.07.24 |
---|---|
Visual Studio 2012에서 ASP.NET MVC 5를 어떻게 설치합니까? (0) | 2020.07.24 |
"원격 추적 지점 '원점 / 개발'을 개발에 병합하는 이유는 무엇입니까?" (0) | 2020.07.24 |
Go에서 현재 타임 스탬프를 어떻게 얻습니까? (0) | 2020.07.23 |
작은 가지 : 여러 조건이있는 경우 (0) | 2020.07.23 |