나는 ‘Dive Into Python’을 읽고 수업 장에서 다음 예제를 제공합니다.
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self)
self["name"] = filename
그런 다음 작성자는 __init__
메소드 를 대체 __init__
하려면 올바른 매개 변수를 사용 하여 상위 를 명시 적으로 호출해야 한다고 말합니다 .
- 만약 그
FileInfo
반에 조상 반이 둘 이상 있다면 어떨까요?- 모든 조상 클래스의
__init__
메소드 를 명시 적으로 호출해야 합니까?
- 모든 조상 클래스의
- 또한 재정의하려는 다른 방법 으로이 작업을 수행해야합니까?
답변
이 책은 서브 클래스-수퍼 클래스 호출과 관련하여 약간 날짜가있다. 내장 클래스의 서브 클래스 화와 관련하여 약간 날짜가 있습니다.
요즘은 다음과 같습니다.
class FileInfo(dict):
"""store file metadata"""
def __init__(self, filename=None):
super(FileInfo, self).__init__()
self["name"] = filename
다음 사항에 유의하십시오.
-
우리는 직접 내장 클래스와 같은 하위 클래스
dict
,list
,tuple
, 등 -
이
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__
학부모 클래스마다 전화해야합니다 . 두 부모 모두에 존재하는 함수를 재정의하는 경우에도 마찬가지입니다.