[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