[Python-de] Styleguide: Properties
Andi Albrecht
andialbrecht at web.de
Fre Okt 28 23:48:46 CEST 2005
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