Подклассы dict: должен ли вызываться dict .__ init __ ()?
Вот двойной вопрос, с теоретической и практической частью:
Когда подклассы диктуют:
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, потому что я бы использовал БД […] синтаксис довольно часто (вместо того, чтобы делать db.contents […] все время); предмет'Только данные (атрибут) действительно действительно диктат. Я хочу добавить несколько методов в базу данных (например,get_image_by_name()
, или жеget_image_by_code()
, например), и только переопределить__init__()
потому что база данных изображений определяется каталогом, в котором она находится.
В итоге(практический) вопрос может быть следующим: что является хорошей реализацией для чего-то, что ведет себя как словарь, за исключением того, что его инициализация отличается (требуется только имя каталога) и что у него есть дополнительные методы? "
Фабрики" были упомянуты во многих ответах. Так что я думаю, все сводится к тому: ты подкласс dict, переопределить__init__()
и добавить методы, или вы пишете (фабричная) функция, которая возвращает dict, к которой вы добавляете методы? Я'Я склонен предпочесть первое решение, потому что функция фабрики возвращает объект, тип которого не указывает на наличие у него дополнительной семантики и методов, но как вы думаете?
Изменить 2:
Я собираюсь от всехответ, что это не хорошая идея, чтобы подкласс диктовать, когда новый класс "это не словарьи, в частности, когда его__init__
метод не может принимать те же аргументы, что и dict's__init__
(что имеет место впрактический вопрос выше). Другими словами, если я правильно понимаю, консенсус выглядит так: когда вы создаете подкласс, все методы (включая инициализацию) должны иметь ту же сигнатуру, что и методы базового класса. Это позволяет isinstance (subclass_instance, dict) гарантировать, чтоsubclass_instance.__init__()
можно использовать какdict.__init__()
, например.
Затем возникает другой практический вопрос: как реализовать класс, аналогичный dict, за исключением метода инициализации? без подклассов? это потребовало бы некоторого надоедливого стандартного кода, не так ли?