Ich schreibe eine Python-Wrapper-Klasse für eine C# API, auf die über Pythonnet zugegriffen wird. Als ich die API mit meinen eigenen Methoden erweitern wollen habe ich beschlossen, es zu wickeln die Zusammensetzung Ansatz here umrissen:Python-Eigenschaft Factory oder Deskriptorklasse zum Umschließen einer externen Bibliothek
Die C# API starke Nutzung von Eigenschaften macht die ich in meinem Python-Code imitieren wollen. Das folgende Beispiel zeigt minimal meinen aktuellen Ansatz für das Beispiel der C# Oberflächenklasse mit den beiden Eigenschaften Breite und Höhe:
class MySurface:
def __init__(api_surface):
self.api_surface = api_surface
@property
def width(self):
return self.api_surface.width
@width.setter
def width(self, value):
self.api_surface.width = value
@property
def height(self):
return self.api_surface.height
@height.setter
def height(self, value):
self.api_surface.height = value
Insgesamt muß ich mit etwa 50 Eigenschaften beschäftigen. Für einige Gruppen von Eigenschaften möchte ich meine eigenen Fehlerprüfungen hinzufügen, Umwandlungen eingeben usw. Was ich suche, ist eine pythonische Art, die Eigenschaften zu definieren, z.B. durch eine Fabrik oder unter Verwendung von Deskriptoren. Danke für Ihre Hilfe!
Edit: Ich möchte Tab Komplettierung innerhalb einer Python-Shell, d. {Hit Tab} sollte Surface.width und Surface.height vorschlagen. Dies scheint mit dem von Greg umrissenen Ansatz getattr nicht möglich zu sein.
Dies ist ein wirklich gutes Beispiel für ein alternatives Kompositionsmuster in Python (anstatt '__getattr__' und' _setattr__' zu verwenden, um Attributsuchen an ein Mitglied zu delegieren). –