Dict podklasy: czy dict .__ init __ () zostanie wywołany?

Oto dwojakie pytanie, z częścią teoretyczną i praktyczną:

Kiedy podklasa dyktuje:

class ImageDB(dict):
    def __init__(self, directory):
        dict.__init__(self)  # Necessary?? 
        ...

powiniendict.__init__(self) nazywać się „miarą bezpieczeństwa” (np. w przypadku, gdy istnieją pewne nietrywialne szczegóły implementacji, które mają znaczenie)? czy istnieje ryzyko, że kod złamie się z przyszłą wersją Pythona, jeślidict.__init__() jestnie nazywa? Szukam podstawowego powodu robienia jednej lub drugiej rzeczy, tutaj (praktycznie, dzwonidict.__init__() jest bezpieczny).

Domyślam się, że kiedyImageDB.__init__(self, directory) nazywa się, że jaźń jest już nowym pustym obiektem dyktatury i dlatego nie ma potrzeby dzwonieniadict.__init__ (Na początku chcę, żeby dyktat był pusty). Czy to jest poprawne?

Edytować:

Bardziej praktyczne pytanie kryjące się za podstawowym pytaniem powyżej jest następujące. Myślałem o dyktowaniu podklasowania, ponieważ używałbym składni db […] dość często (zamiast robić cały czas db.contents […]); jedyne dane obiektu (atrybut) są rzeczywiście dyktatem. Chcę dodać kilka metod do bazy danych (na przykładget_image_by_name()lubget_image_by_code(), na przykład), i nadpisuj tylko__init__(), ponieważ baza danych obrazów jest zdefiniowana przez katalog, który ją zawiera.

W podsumowaniu, (praktyczne) pytanie może brzmieć: jaka jest dobra implementacja dla czegoś, co zachowuje się jak słownik, z wyjątkiem tego, że jego inicjalizacja jest inna (ma tylko nazwę katalogu) i ma dodatkowe metody?

„Fabryki” zostały wymienione w wielu odpowiedziach. Myślę więc, że wszystko sprowadza się do: czy podklasujesz dyktę, zastępujesz__init__() i dodaj metody, czy piszesz funkcję (fabryczną), która zwraca dyktę, do której dodajesz metody? Jestem skłonny preferować pierwsze rozwiązanie, ponieważ funkcja fabryki zwraca obiekt, którego typ nie wskazuje, że ma dodatkową semantykę i metody, ale co o tym sądzisz?

Edytuj 2:

Zbieram od odpowiedzi wszystkich, że nie jest dobrym pomysłem na podklasę dyktatury, gdy nowa klasa „nie jest słownikiem”, aw szczególności, gdy jej klasa__init__ metoda nie może przyjmować tych samych argumentów co dict__init__ (tak jest w przypadku „pytania praktycznego” powyżej). Innymi słowy, jeśli dobrze rozumiem, konsensus wydaje się być następujący: kiedy podklasa, wszystkie metody (w tym inicjalizacja) muszą mieć ten sam podpis, co metody klasy bazowej. Pozwala to zagwarantować to (instancja podklasy, dykta)subclass_instance.__init__() może być używany jakdict.__init__(), na przykład.

Następnie pojawia się kolejne praktyczne pytanie: w jaki sposób zaimplementować klasę podobną do dyktowania, z wyjątkiem metody inicjalizacji? bez podklasy? wymagałoby to kłopotliwego kodu, nie?

questionAnswers(4)

yourAnswerToTheQuestion