나는 동작합니다 좋아하는 사용자 정의 클래스 작성하려면 dict
, 그래서 내가로부터 상속 오전 - dict
.
하지만 내 질문은 : dict
내 __init__()
메서드 에서 비공개 멤버 를 만들어야 합니까?입니다. 나는 dict
단순히에서 상속하면 이미 동작 이 있기 때문에 이것의 요점을 보지 못합니다 dict
.
대부분의 상속 스 니펫이 아래와 같은 이유를 누구든지 지적 할 수 있습니까?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
더 간단한 대신 ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
사실 저는 사용자가 사전에 직접 액세스 할 수 없도록하는 질문에 대한 대답이라고 생각합니다 (즉, 사용자가 제공 한 액세스 방법을 사용해야 함).
그러나 배열 액세스 연산자는 []
어떻습니까? 어떻게 구현할까요? 지금까지 []
연산자 를 재정의하는 방법을 보여주는 예를 보지 못했습니다 .
따라서 []
사용자 정의 클래스에 액세스 기능이 제공되지 않으면 상속 된 기본 메서드가 다른 사전에서 작동합니까?
Python 상속에 대한 이해를 테스트하기 위해 다음 스 니펫을 시도했습니다.
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
다음과 같은 오류가 발생했습니다.
KeyError : <내장 함수 ID>
위의 코드에 어떤 문제가 있습니까?
myDict
이와 같은 코드를 작성할 수 있도록 클래스를 수정하려면 어떻게해야 합니까?
md = myDict()
md['id'] = 123
[편집하다]
책상에서 멀어지기 전에 만든 어리석은 오류를 없애기 위해 위의 코드 샘플을 편집했습니다. 오타였습니다 (오류 메시지에서 발견 했어야합니다).
dict
객체 자체 (사용super
)를 사용해야합니다.__dict__
이는 본질적으로 모든 인스턴스에 대해 두 개의 딕셔너리를 생성한다는 것을 의미합니다.