[python] 파이썬에서 상속 및 __init__ 재정의

나는 ‘Dive Into Python’을 읽고 수업 장에서 다음 예제를 제공합니다.

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

그런 다음 작성자는 __init__메소드 를 대체 __init__하려면 올바른 매개 변수를 사용 하여 상위 를 명시 적으로 호출해야 한다고 말합니다 .

  1. 만약 그 FileInfo반에 조상 반이 둘 이상 있다면 어떨까요?
    • 모든 조상 클래스의 __init__메소드 를 명시 적으로 호출해야 합니까?
  2. 또한 재정의하려는 다른 방법 으로이 작업을 수행해야합니까?


답변

이 책은 서브 클래스-수퍼 클래스 호출과 관련하여 약간 날짜가있다. 내장 클래스의 서브 클래스 화와 관련하여 약간 날짜가 있습니다.

요즘은 다음과 같습니다.

class FileInfo(dict):
    """store file metadata"""
    def __init__(self, filename=None):
        super(FileInfo, self).__init__()
        self["name"] = filename

다음 사항에 유의하십시오.

  1. 우리는 직접 내장 클래스와 같은 하위 클래스 dict, list, tuple, 등

  2. super함수는이 클래스의 수퍼 클래스 추적 및 적절하게 함수 호출을 처리합니다.


답변

상속 해야하는 각 클래스에서 하위 클래스를 시작할 때 초기화 해야하는 각 클래스의 루프를 실행할 수 있습니다 … 복사 가능한 예제가 더 잘 이해 될 수 있습니다 …

class Female_Grandparent:
    def __init__(self):
        self.grandma_name = 'Grandma'

class Male_Grandparent:
    def __init__(self):
        self.grandpa_name = 'Grandpa'

class Parent(Female_Grandparent, Male_Grandparent):
    def __init__(self):
        Female_Grandparent.__init__(self)
        Male_Grandparent.__init__(self)

        self.parent_name = 'Parent Class'

class Child(Parent):
    def __init__(self):
        Parent.__init__(self)
#---------------------------------------------------------------------------------------#
        for cls in Parent.__bases__: # This block grabs the classes of the child
             cls.__init__(self)      # class (which is named 'Parent' in this case), 
                                     # and iterates through them, initiating each one.
                                     # The result is that each parent, of each child,
                                     # is automatically handled upon initiation of the 
                                     # dependent class. WOOT WOOT! :D
#---------------------------------------------------------------------------------------#



g = Female_Grandparent()
print g.grandma_name

p = Parent()
print p.grandma_name

child = Child()

print child.grandma_name


답변

당신은 정말하지 않습니다 통화에 __init__기본 클래스 (들)의 방법을,하지만 당신은 일반적으로 원하는 기본 클래스 작업에 수업 방법의 나머지 부분에 대한 필요가 몇 가지 중요한 초기화를 할 것이기 때문에 그것을 할 수 있습니다.

다른 방법의 경우 의도에 따라 다릅니다. 기본 클래스 비헤이비어에 무언가를 추가하려는 경우 자신의 코드에 추가로 기본 클래스 메서드를 호출하려고합니다. 기본적으로 동작을 변경하려는 경우 기본 클래스의 메소드를 호출하지 않고 파생 된 클래스에서 모든 기능을 직접 구현할 수 있습니다.


답변

FileInfo 클래스에 둘 이상의 조상 클래스가있는 경우 반드시 __init __ () 함수를 모두 호출해야합니다. 또한 소멸자 인 __del __ () 함수에 대해서도 동일하게 수행해야합니다.


답변

예, __init__학부모 클래스마다 전화해야합니다 . 두 부모 모두에 존재하는 함수를 재정의하는 경우에도 마찬가지입니다.


답변