IT

기본 (슈퍼) 클래스를 초기화 초기화?

lottoking 2020. 7. 24. 07:23
반응형

기본 (슈퍼) 클래스를 초기화 초기화?


여기서는 다음 코드가 생각하십시오.

>>> 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

반응형