programing

기본(슈퍼) 클래스를 초기화하려면 어떻게 해야 합니까?

batch 2023. 6. 30. 22:13
반응형

기본(슈퍼) 클래스를 초기화하려면 어떻게 해야 합니까?

Python에서 다음 코드가 있다고 가정합니다.

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__서브클래스에서?나는 파이썬 튜토리얼을 따르고 있는데 그것은 그것을 다루지 않습니다.제가 구글에서 검색했을 때, 저는 한 가지 이상의 방법을 찾았습니다.이것을 처리하는 표준 방법은 무엇입니까?

Python(버전 3까지)은 "old-style" 및 new-style 클래스를 지원합니다.는 새운스클다파생다음니됩서에래는스로타일▁are다▁from▁new▁derived에서 파생되었습니다.object및 는 사용 중인 것이며, 예를 들어 를 통해 기본 클래스를 호출합니다.

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)

python은 오래된 스타일과 새로운 스타일의 클래스에 대해 알고 있기 때문에 기본 메서드를 호출하는 방법이 다양합니다.

완전성을 위해, 오래된 스타일의 클래스는 기본 클래스를 사용하여 기본 메서드를 명시적으로 호출합니다.

def doit(self, foo):
  return X.doit(self, foo)

하지만 당신은 더 이상 구식을 사용해서는 안 되기 때문에, 저는 이것에 대해 너무 신경 쓰지 않을 것입니다.

클래스에 만 알고 (Python ).object또는 그렇지 않음).

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

둘다요.

SuperClass.__init__(self, x)

또는

super(SubClass,self).__init__( x )

작동할 것입니다(저는 두 번째 것이 DRY 원칙에 더 충실하기 때문에 두 번째 것을 선호합니다).

다음을 참조하십시오. http://docs.python.org/reference/datamodel.html#basic-customization

기본(슈퍼) 클래스를 초기화하려면 어떻게 해야 합니까?

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__방법:

 class SubClass(SuperClass):
      def __init__(self, y):
          super(SubClass, self).__init__('x')
          self.y = y

파이썬 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

반환만 가능합니다. 개체를 수정하기 위한 것입니다.

ㅠㅠ__new__

인스턴스를 초기화하는 다른 방법이 있습니다. 이것은 Python에서 불변 유형의 하위 클래스를 위한 유일한 방법입니다.그래서 당신이 하위 클래스를 원한다면 그것은 필요합니다.str또는tuple또는 다른 불변의 물체.

암묵적인 클래스 인수를 얻기 때문에 클래스 메소드라고 생각할 수 있습니다.하지만 실제로는 정적인 방법입니다.그래서 당신은 전화를 해야 합니다.__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')

파이썬 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

반응형