Subclassing dict: deveria ditar .__ init __ () ser chamado?
Aqui está uma questão dupla, com uma parte teórica e uma prática:
Quando subclassing dict:
class ImageDB(dict):
def __init__(self, directory):
dict.__init__(self) # Necessary??
...
devemosdict.__init__(self)
ser chamado, assim como uma medida de "segurança" (por exemplo, no caso de haver alguns detalhes de implementação não-triviais que importam)? existe o risco de o código romper com uma versão futura do Python sedict.__init__()
énão chamado? Eu estou procurando uma razão fundamental para fazer uma coisa ou outra, aqui (praticamente chamandodict.__init__()
é seguro).
Meu palpite é que quandoImageDB.__init__(self, directory)
é chamado, o self já é um novo objeto dict vazio e, portanto, não há necessidade de chamardict.__init__
(Eu quero que o dict seja vazio, no começo). Isso está correto?
Editar:
A questão mais prática por trás da questão fundamental acima é a seguinte. Eu estava pensando em subclassing dict porque eu usaria a sintaxe do banco de dados […] com bastante frequência (ao invés de fazer db.contents [...] o tempo todo); os únicos dados do objeto (atributo) são realmente um ditador. Eu quero adicionar alguns métodos para o banco de dados (comoget_image_by_name()
ouget_image_by_code()
, por exemplo), e apenas substituir o__init__()
, porque o banco de dados de imagens é definido pelo diretório que o contém.
Em suma, a questão (prática) poderia ser: o que é uma boa implementação para algo que se comporta como um dicionário, exceto que sua inicialização é diferente (leva apenas um nome de diretório), e que possui métodos adicionais?
"Fábricas" foram mencionadas em muitas respostas. Então eu acho que tudo se resume a: você subclasse dit, override__init__()
e adicionar métodos, ou você escreve uma função (de fábrica) que retorna um dict, ao qual você adiciona métodos? Eu estou inclinado a preferir a primeira solução, porque a função de fábrica retorna um objeto cujo tipo não indica que tem semântica e métodos adicionais, mas o que você acha?
Editar 2:
Eu entendo da resposta de todos que não é uma boa idéia subclassificar ditto quando a nova classe "não é um dicionário", e em particular quando__init__
método não pode ter os mesmos argumentos que os ditames__init__
(que é o caso da "questão prática" acima). Em outras palavras, se eu entendi corretamente, o consenso parece ser: quando você subclasse, todos os métodos (incluindo a inicialização) devem ter a mesma assinatura que os métodos da classe base. Isso permite que isinstance (subclass_instance, dict) garanta quesubclass_instance.__init__()
pode ser usado comodict.__init__()
, por exemplo.
Outra questão prática surge: como uma classe que é igual a dict, exceto pelo seu método de inicialização, deve ser implementada? sem subclassificação? isso exigiria algum código chato, não?