Я хочу написати користувальницький клас, який поводиться так 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
Насправді, я думаю, я підозрюю, що відповідь на це питання полягає в тому, що користувачі не можуть безпосередньо отримати доступ до вашого словника (тобто вони повинні використовувати надані вами методи доступу).
Однак як щодо оператора доступу до масиву []
? Як би хтось реалізував це? Поки що я не бачив приклад, який показує, як перекрити []
оператора.
Так що якщо a []
функція доступу не передбачена у спеціальному класі, успадковані базові методи будуть працювати в іншому словнику?
Я спробував наступний фрагмент, щоб перевірити своє розуміння спадщини 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: <вбудований ідентифікатор функції>
Що не так з кодом вище?
Як виправити клас, myDict
щоб я міг написати такий код?
md = myDict()
md['id'] = 123
[Редагувати]
Я відредагував зразок коду вище, щоб позбутися дурної помилки, яку я зробив, перш ніж я відскочив від свого робочого столу. Це був помилковий помилок (я мав це помітити з повідомлення про помилку).
dict
, то вам слід використовувати сам об’єкт (використовуючиsuper
), а не просто делегувати до екземпляра__dict__
- що по суті означає, що ви створюєте два дикти для кожного примірника.