Also, ich versuche herauszufinden, was der beste (eleganteste und mit dem geringsten Code) Weg ist, bestimmte Funktionen einer Eigenschaft zu überschreiben (z. B. nur den Getter, nur den Setter usw.) in Python. Ich bin ein Fan von der folgenden Methode, Eigenschaften zu definieren, da alle ihre Methoden im selben eingerückten Codeblock eingeschlossen sind (es ist einfacher zu sehen, wo die Funktionen einer Eigenschaft aufhören und die Funktionen der nächsten beginnen):
@apply
def foo():
"""Ein Foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
Allerdings, wenn ich von einer Klasse erben möchte, die Eigenschaften auf diese Weise definiert, und dann zum Beispiel die Setter-Funktion von foo
überschreiben möchte, scheint dies schwierig. Ich habe etwas recherchiert und die meisten Antworten, die ich gefunden habe, waren, separate Funktionen in der Basisklasse zu definieren (z. B. getFoo
und setFoo
), explizit eine Eigenschaftendefinition daraus zu erstellen (z. B. foo = property(lambda x: x.getFoo(), lambda x, y: x.setFoo(y), lambda x: x.delFoo())
) und dann getFoo
, setFoo
und delFoo
nach Bedarf zu überschreiben.
Diese Lösung gefällt mir nicht, denn es bedeutet, dass ich Lambdas für jede Eigenschaft definieren muss, und dann jeden Funktionsaufruf ausschreiben muss (während ich vorher einfach property(**locals())
hätte tun können). Außerdem erhalte ich nicht die ursprüngliche Kapselung.
Idealerweise würde ich gerne folgendes tun können:
class A(object):
def __init__(self):
self.foo = 8
@apply
def foo():
"""Ein Foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
class ATimesTwo(A):
@some_decorator
def foo():
def fset(self, val):
self._foo = val * 2
return something
Und dann würde die Ausgabe ungefähr so aussehen:
>>> a = A()
>>> a.foo
8
>>> b = ATimesTwo()
>>> b.foo
16
Grundsätzlich erbt ATimesTwo
die Getter-Funktion von A
, überschreibt aber die Setter-Funktion. Weiß jemand, wie man das machen kann (auf ähnliche Weise wie im obigen Beispiel)? Wie würde der some_decorator
aussehen und was sollte die foo
Funktion zurückgeben?