Hallo Liste, seit einiger Zeit frage ich mich nun schon, wie ich am besten mit properties umgehe. Im Moment besonders, ob getter und setter private Funktionen sein sollten, sprich sollte es dem User möglich sein, die getter und setter direkt zu benutzen? Folgendes Beispiel: Ich habe eine Klasse, die eine SQL-Prozedur beschreibt und die Attribute "name" und "arguments" hat, wobei "name" der Name der Prozedur (ein einfacher String) und "arguments" die Argumente für die Prozedur wiedergeben. "name" kann ich locker mit öffentlichem getter und setter versehen, "arguments" soll aber immer die richtige Reihenfolge zurückliefern. Ich käme also zu folgendem Ergebnis: class Procedure(object): def __init__(self, name = None): self.__name = "" self.__args = {} if name: self.name = name def get_name(self): return self.__name def set_name(self, name): self.__name = name name = property(fset = set_name, fget = get_name) def __get_args(self): return self.__args def __set_args(self, args): self.__args = args args = property(fset = __set_args, fget = __get_args) def get_args(self): keys = self.args.keys() keys.sort() ret = [] for k in keys: ret.append(self.args[k]) return ret Mir geht es jetzt nicht darum, ob "self.__args" sinnvoller auszulesen ist (z.B, durch eigene Klassen mit __cmp__), sondern nur darum was ihr davon haltet, ob eine Unterscheidung zwischen interner Datenhaltung und dem, was man nach außen gibt, sinnvoll sein kann und ob aus Anwendersicht (= Entwickler, der solch ein Modul benutzt) in gewissen Anwendungsfällen ein "Überladen" von Bezeichnern sinnvoll sein kann. Ein Anwendungsbeipiel... Interne Initialisierung: proc = Procedure("foo") proc.args[0] = "arg1" proc.args[1] = "arg2" Verwendung: for item in proc.get_args(): print item Grüße, Andi _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Andi, ob getter und setter privateFunktionen sein sollten getter und setter verdienen keine Diskussion, die stammen aus einer anderen Welt. In Python ist die Grundregel: wir sind alle erwachsen. Also nix mit class fisch: getwilli(self,willi): return willi sondern: whatever=fisch.willi direkter Attributzugriff. Und gut ist. WENN irgendwann der THEORETHISCHE Fall eintritt, daß das nimmer ein simples dict-lookup ist, sondern eine Funktion oder ein Webservice (jaaa, auch ich habe die ganzen Kapselungstheorien gelesen), DANN, und genau DANN, und KEINE SEKUNDE FRÜHER, wird mit property diese Möglichkeit geschaffen. Für mich ist es so: mit Python programmiere ich für das Leben wie es ist; was auch eine ZEN-Ansicht ist. Nicht für eine Welt, wie sie sein sollte :) Interne Initialisierung:
proc = Procedure("foo") proc.args[0] = "arg1" proc.args[1] = "arg2"
Hmmm... die Instanzvariablen einer gewöhnlichen Python-Klasse liegen in einem gewöhnlichen Dictionary. Also: class fisch: pass fisch.schuppe=True fisch.farbe="schwarz" ergibt dann, daß fisch.__dict__ die schuppe und die farbe enthält (+ ein paar innereien) Welchen konkreten Vorteil erhoffst Du Dir dadurch, daß Du NOCHMALS so ein Dictionary machst? Es ist keinen Deut sicherer, es ist langsamer und braucht mehr Zeichen beim Tippen. Wenn irgendjemand MÜLL in Dein ___args schiebt, geht das Programm genauso vor die Hunde wie wenn jemand das __dict__ des Objekts versaut. Meine Empfehlung daher: #define private public und schau nach, ob die Welt untergeht. Wenn nicht, ist all das private für nüscht. Lieber Gruß Harald -- GHUM Harald Massa persuasion python postgresql Harald Armin Massa Reinsburgstraße 202b 70197 Stuttgart 0173/9409607 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
Andi Albrecht schrieb:
seit einiger Zeit frage ich mich nun schon, wie ich am besten mit properties umgehe. Im Moment besonders, ob getter und setter private Funktionen sein sollten, sprich sollte es dem User möglich sein, die getter und setter direkt zu benutzen?
Möglich natürlich, warum denn auch nicht? Wenn du nicht möchtest, dass der das dann auch tut, dann schreib's in den Doc-String der Funktion, dazu ist Dokumentation da. Wer's dann trotzdem tut, ist selbst schuld. Andere Möglichkeit: Lass den Funktionsnamen mit '_' anfangen. Das bedeutet im Allgemeinen, dass die Funktion nicht zur öffentlichen API gehört. Stefan _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (3)
-
Andi Albrecht
-
Harald Armin Massa
-
Stefan Behnel