/ / Mit __getattr__ um Child-Methoden für bestimmte Typen aufzurufen? - Python, Python-2.7, Rekursion, getattr

Mit __getattr__ rufen Sie untergeordnete Methoden für bestimmte Typen auf? - Python, Python-2.7, Rekursion, getattr

Ich habe eine Klasse, deren Felder eine Instanz einer anderen Klasse sind.

class Field:
def get(self):
def set(self, value):
def delete(self):

class Document:
def __init__(self):
self.y = Field()
self.z = True

Was ich gerne tun könnte, ist, wenn eine Instanz des Elternteils auf seine Attribute verweist, stattdessen ruft sie die Methoden des Kindes auf.

d = Document()
d.y = "some value"  # Calls the `set` function of the Field
d.y == "some value"  # Calls the `get` function of the Field
del d.y  # Calls the `delete` function of the Field

Der andere Haken ist, dass ich nur dieses Verhalten möchte, wenn das Feld vom Typ ist Field.

Ich stoße auf Rekursionsprobleme, versuche zu verwenden __getattr__ und dergleichen, in Übereinstimmung mit:

def __getattr__(self, key):
if isinstance(getattr(self, key), Field):
return getattr(self, key).get()
return getattr(self, key)

Die Rekursion ist ziemlich offensichtlich, warum es passiert ... aber wie vermeide ich es?

Ich habe schon einige Beispiele auf StackOverflow gesehen, aber ich kann nicht herausfinden, wie ich es umgehen kann.

Antworten:

1 für die Antwort № 1

Was Sie dort beschreiben, ist mehr oder weniger genau die Art und Weise, wie Python-Zugriffsattribute einer Klasse mit dem Descriptor-Protokoll

Machen Sie einfach Ihre Feldklassen ein __get__, __set__ und __delete__ Methode wie in beschrieben https://docs.python.org/2/howto/descriptor.html - Und stellen Sie sicher, dass Sie alle Klassen haben object als Basisklasse, ansonsten erben sie vonOld-Style-Klassen, die nur aus Kompatibilitätsgründen in Python 2 existieren und seit Python 2.2 veraltet sind (und das Deskriptor-Protokoll vollständig ignorieren)