Вот двоякий вопрос с теоретической частью и практический:
При подклассификации dict:
class ImageDB(dict):
def __init__(self, directory):
dict.__init__(self) # Necessary??
...
следует dict.__init__(self)
вызывать, как меру "безопасности" (например, если есть некоторые нетривиальные детали реализации, которые имеют значение)? существует ли риск того, что код сломается с будущей версией Python, если dict.__init__()
не вызван? Я ищу фундаментальную причину делать то или другое, здесь (практически, вызов dict.__init__()
безопасен).
Я предполагаю, что при вызове ImageDB.__init__(self, directory)
self уже является новым пустым объектом dict и поэтому нет необходимости вызывать dict.__init__
(сначала я хочу, чтобы dict был пустым). Правильно ли это?
Edit
Более практический вопрос, лежащий в основе фундаментального вопроса выше, заключается в следующем. Я думал о подклассе dict, потому что я часто использовал синтаксис db [...] (вместо того, чтобы делать db.contents [...] все время); объект только данные (атрибут) действительно действительно является dict. Я хочу добавить несколько методов в базу данных (например, get_image_by_name()
или get_image_by_code()
), и только переопределить __init__()
, потому что база данных изображений определяется каталогом, которая ее содержит.
В резюме может возникнуть (практический) вопрос: что является хорошей реализацией для того, что ведет себя как словарь, за исключением того, что его инициализация отличается (она принимает только имя каталога) и что у него есть дополнительные методы?
"Заводы" упоминались во многих ответах. Поэтому я предполагаю, что все это сводится к: вы подклассифицируете dict, переопределяете __init__()
и добавляете методы, или вы пишете функцию (factory), которая возвращает dict, к которой вы добавляете методы? Я склонен предпочесть первое решение, потому что функция factory возвращает объект, тип которого не указывает, что он имеет дополнительные семантики и методы, но что вы думаете?
Изменить 2:
Я собираюсь от всех ответить, что это не очень хорошая идея для подкласса dict, когда новый класс "не является словарем", и в частности, когда его метод __init__
не может принимать те же аргументы, что и dict __init__
(который имеет место в "практическом вопросе" выше). Другими словами, если я правильно понимаю, консенсус представляется следующим: когда вы подклассом, все методы (включая инициализацию) должны иметь одинаковую подпись, как методы базового класса. Это позволяет isinstance (subclass_instance, dict) гарантировать, что subclass_instance.__init__()
может использоваться, например, как dict.__init__()
.
Затем появляется другой практический вопрос: как должен реализоваться класс, похожий на dict, за исключением его метода инициализации? без подкласса? для этого потребуется какой-то докучливый код шаблона, не?