Я хочу написати користувальницький клас, який поводиться так 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__- що по суті означає, що ви створюєте два дикти для кожного примірника.