Ich implementig ein Kompositum-Muster in this way:Python zusammengesetzte Muster Ausnahmebehandlung & Pylint
1) die "abstrakt" Komponente:
class Component(object):
"""Basic Component Abstraction"""
def __init__(self, *args, **kw):
raise NotImplementedError("must be subclassed")
def status(self):
"""Base Abstract method"""
raise NotImplementedError("must be implemented")
2) ein Blatt:
class Leaf(Component):
"""Basic atomic component
"""
def __init__(self, *args, **kw):
self.dict = {}
def status(self):
"""Retrieves properties
"""
return self.dict
Das Problem ist, dass pylint erzeugt natürlich diese Warnung:
Leaf.__init__: __init__ method from base class 'Component' is not called
aber in meinem Blatt i für nicht nennen kann:
def __init__(self, *args, **kw):
Component.__init__(self, *args, **kw)
self.dict = {}
ohne Erhöhung der Ausnahme.
Muss ich die pylint-Warnung ignorieren oder gibt es eine schlechte Codierung?
Sie vorschlagen: "Abstrakte Initialisierer sind eine schlechte Idee. Ihr Code könnte sich entwickeln, so dass Sie einige Initialisierung in der Stammkomponente vornehmen möchten", aber ich bin in ein zusammengesetztes Muster und es muss solche Abstraktion haben. – DrFalk3n
@ DrFalk3n. Lass uns nicht über die Java-Version des Musters fetischisieren. Java-Leute lieben ihre abstrakten Klassen. Python hat das einfach nicht. Wir sind alle Erwachsene hier, wir alle wissen, dass die abstrakte Klasse nicht funktioniert. Die Abstraktion von __init__, die NotImplemented auslöst, ist wirklich in Ordnung. Sie müssen die Java-/C++ - Dummheit in Python nicht erneut aufarbeiten. –
Das zusammengesetzte Muster bedeutet nicht, dass Sie keinen gemeinsamen Initialisierungscode in der Basisklasse haben könnten. Was Sie vermeiden möchten, ist die Instanziierung der Basisklasse. Also check das mit if type (self) == Komponente: raise Exception ("Component darf nicht direkt instanziiert werden") –