Seite 1 von 1
Interfaces in Python?
Verfasst: Freitag 23. April 2010, 10:34
von LiLaLaunebär
Hi,
ich habe folgendes vor:
ich habe LagerObjekte, die ein Warenhasu darstellen. Jedes Warenhaus verfolgt eine bestimte Bestellpolitik, die als Objekt in einer Variablen namens "Policy" gespeichert ist. Dieses "Policy"-Objekt hat eine Methode ApplyPolicy() und eine Variable "Typ".
Es ist jetzt so, dass mehrer Leute mit diesem Modell arbeiten und jeder kann quasi seine eigene Policy programmieren. Ich will aber sicherstellen, dass jede Policy, die übergeben wird, auch wirklich die Methode ApplyPolicy() und eine "Typ"-Variable enthält, sonst soll eine Fehlermeldung kommen.
Wie löse ich das am geschicktesten in Python? Gibts da wie in Javas Interfaces, die einem zwingen, eine Methode zu implementieren und erlauben, eine Variable zu übergeben?
Wenn ich Vererbung verwende, dann ist die Methode ApplyPolicy() ja nicht leer, sondern ist ja bereits implementiert...
Danke für nen Tipp
Verfasst: Freitag 23. April 2010, 11:04
von helduel
Moin,
schau dir mal das abc-Modul an. Da kannst du abstrakte Methoden und Properties definieren, die von Subklassen implementiert werden müssen.
Oder du schaust einfach mit hasattr, ob die übergebene Klasse/Instanz die betreffenden Attribute besitzt.
Gruß,
Manuel
Verfasst: Freitag 23. April 2010, 11:25
von BlackJack
@LiLaLaunebär: Oder Du machst einfach *gar nichts*. Du willst eine Fehlermeldung wenn die Methode nicht existiert? Die gibt's gratis:
Code: Alles auswählen
In [143]: a.spam()
---------------------------------------------------------------------------
<type 'exceptions.AttributeError'> Traceback (most recent call last)
/home/bj/<ipython console> in <module>()
<type 'exceptions.AttributeError'>: 'NoneType' object has no attribute 'spam'
Wenn jemand die Doku nicht liest und nicht das geforderte implementiert, hat er halt Pech gehabt. Wenn Du erzwingst das die Methode existieren muss, ist immer noch nicht gewährleistet, dass sie auch das richtige tut. Es läuft am Ende immer darauf hinaus, dass der Programmierer einer `Policy` wissen muss was er da tut und was von ihm erwartet wird.
Verfasst: Freitag 23. April 2010, 11:35
von LiLaLaunebär
ok, thx.
das mit hasatrr ist übrigens ne super sache...
Verfasst: Freitag 23. April 2010, 11:36
von jbs
LiLaLaunebär hat geschrieben:ok, thx.
das mit hasatrr ist übrigens ne super sache...
Geht so. Zu viel sollte man davon nicht haben.
Re: Interfaces in Python?
Verfasst: Sonntag 25. April 2010, 10:39
von sma
LiLaLaunebär hat geschrieben:Gibts da wie in Javas Interfaces, die einem zwingen, eine Methode zu implementieren und erlauben, eine Variable zu übergeben?
Nein, in Python wirst du nicht gezwungen. Dokumentiere deinen Wunsch und hoffe, dass du oder ein anderer Entwickler sich dann daran halten. Einen Compiler, der statisch die Hoffnung prüft (wie in Java) gibt es nicht. Und auch dort bekommst du ja nicht mehr als die Zusicherung, dass eine syntaktisch gleiche Signatur implementiert wurde. Ob sich die Methode überhaupt an den vereinbarten Kontrakt hält, ist auch dort Wunsch und Hoffnung.
Stefan
Verfasst: Montag 26. April 2010, 08:07
von LiLaLaunebär
hab noch eine methode gefunden, die für meine zwecke dienlich ist. hier ein auszug:
Code: Alles auswählen
class StockPolicy:
"""Super class for all stock policies"""
def __init__(self):
self.TYPE="STOCKPOLICY"
def ApplyPolicy(self,ObservedStorage):
# return type: void -> must not return anything
# insert the increaseItemsOutstanding statement (if needed)!
raise NotImplementedErro
aber nochmal danke für eure hilfe
Verfasst: Montag 26. April 2010, 09:34
von HerrHagen
Was soll das eigentlich mit der TYPE bezwecken? Dir ist schon klar das du folgendes machen kannst:
Code: Alles auswählen
>>> class StockPolicy(object):
... """Super class for all stock policies"""
... def apply_policy(self, observed_storage):
... raise NotImplementedError
>>> p = StockPolicy()
>>> type(p)
1: <class '__main__.StockPolicy'>
>>> isinstance(p, StockPolicy)
2: True
>>> type(p) == StockPolicy
3: True
Der Typ eines jeden Objektes ist zur Laufzeit bekannt (der Typ als solches ist auch wieder ein Objekt und kann demzufolge in Listen abgespeichert, verglichen, etc. werden). Das heisst das du den Typ nicht extra im Objekt als String abspeichern brauchst.
Verfasst: Montag 26. April 2010, 09:51
von LiLaLaunebär
nein, das mit dem "isinstance"/type wusste ich noch nicht...das ist natürlich praktisch...
danke

Verfasst: Montag 26. April 2010, 11:52
von cofi
Ab Python 2.6 ist vielleicht auch [mod]abc[/mod] nuetzlich fuer dich.