Im Allgemeinen ist der beste Ansatz, den ich gefunden habe, das Überschreiben __ilshift__
als Setter und __rlshift__
als Getter, der vom Immobiliendekorateur dupliziert wird. Es ist fast der letzte Operator, der nur (| & ^) aufgelöst wird und logisch niedriger ist. Es wird selten verwendet ( __lrshift__
ist weniger, kann aber berücksichtigt werden).
Bei Verwendung des PyPi-Zuweisungspakets kann nur die Vorwärtszuweisung gesteuert werden, sodass die tatsächliche "Stärke" des Bedieners geringer ist. Beispiel für ein PyPi-Zuweisungspaket:
class Test:
def __init__(self, val, name):
self._val = val
self._name = name
self.named = False
def __assign__(self, other):
if hasattr(other, 'val'):
other = other.val
self.set(other)
return self
def __rassign__(self, other):
return self.get()
def set(self, val):
self._val = val
def get(self):
if self.named:
return self._name
return self._val
@property
def val(self):
return self._val
x = Test(1, 'x')
y = Test(2, 'y')
print('x.val =', x.val)
print('y.val =', y.val)
x = y
print('x.val =', x.val)
z: int = None
z = x
print('z =', z)
x = 3
y = x
print('y.val =', y.val)
y.val = 4
Ausgabe:
x.val = 1
y.val = 2
x.val = 2
z = <__main__.Test object at 0x0000029209DFD978>
Traceback (most recent call last):
File "E:\packages\pyksp\pyksp\compiler2\simple_test2.py", line 44, in <module>
print('y.val =', y.val)
AttributeError: 'int' object has no attribute 'val'
Das gleiche gilt für die Verschiebung:
class Test:
def __init__(self, val, name):
self._val = val
self._name = name
self.named = False
def __ilshift__(self, other):
if hasattr(other, 'val'):
other = other.val
self.set(other)
return self
def __rlshift__(self, other):
return self.get()
def set(self, val):
self._val = val
def get(self):
if self.named:
return self._name
return self._val
@property
def val(self):
return self._val
x = Test(1, 'x')
y = Test(2, 'y')
print('x.val =', x.val)
print('y.val =', y.val)
x <<= y
print('x.val =', x.val)
z: int = None
z <<= x
print('z =', z)
x <<= 3
y <<= x
print('y.val =', y.val)
y.val = 4
Ausgabe:
x.val = 1
y.val = 2
x.val = 2
z = 2
y.val = 3
Traceback (most recent call last):
File "E:\packages\pyksp\pyksp\compiler2\simple_test.py", line 45, in <module>
y.val = 4
AttributeError: can't set attribute
Der <<=
Bediener, der Wert auf eine Immobilie legt, ist die visuell sauberere Lösung und versucht nicht, einige reflektierende Fehler zu machen, wie:
var1.val = 1
var2.val = 2
var1.val = var2
var1.val = var2.val
somevar = var1 + var2
var1 += var2
var1 = var2