Interfaces in Python?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

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
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

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
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.
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

ok, thx.
das mit hasatrr ist übrigens ne super sache...
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

LiLaLaunebär hat geschrieben:ok, thx.
das mit hasatrr ist übrigens ne super sache...
Geht so. Zu viel sollte man davon nicht haben.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

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
Benutzeravatar
HerrHagen
User
Beiträge: 430
Registriert: Freitag 6. Juni 2008, 19:07

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.
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

nein, das mit dem "isinstance"/type wusste ich noch nicht...das ist natürlich praktisch...
danke :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ab Python 2.6 ist vielleicht auch [mod]abc[/mod] nuetzlich fuer dich.
Antworten