Im Allgemeinen könnte es alles bedeuten . Es war bereits erklärt , was es bedeutet , wenn x
eine ist list
oder numpy.ndarray
aber im Allgemeinen es hängt nur davon ab , wie die Vergleichsoperator ( <
, >
, ...) und auch , wie das get / set-item ( [...]
-Syntax) implementiert.
x.__getitem__(x.__lt__(2)) # this is what x[x < 2] means!
x.__setitem__(x.__lt__(2), 0) # this is what x[x < 2] = 0 means!
Weil:
x < value
ist äquivalent zu x.__lt__(value)
x[value]
ist (ungefähr) äquivalent zu x.__getitem__(value)
x[value] = othervalue
ist (auch ungefähr) äquivalent zu x.__setitem__(value, othervalue)
.
Dies kann angepasst werden, um alles zu tun, was Sie wollen. Nur als Beispiel (ahmt eine etwas numpys-boolesche Indizierung nach):
class Test:
def __init__(self, value):
self.value = value
def __lt__(self, other):
# You could do anything in here. For example create a new list indicating if that
# element is less than the other value
res = [item < other for item in self.value]
return self.__class__(res)
def __repr__(self):
return '{0} ({1})'.format(self.__class__.__name__, self.value)
def __getitem__(self, item):
# If you index with an instance of this class use "boolean-indexing"
if isinstance(item, Test):
res = self.__class__([i for i, index in zip(self.value, item) if index])
return res
# Something else was given just try to use it on the value
return self.value[item]
def __setitem__(self, item, value):
if isinstance(item, Test):
self.value = [i if not index else value for i, index in zip(self.value, item)]
else:
self.value[item] = value
Nun wollen wir sehen, was passiert, wenn Sie es verwenden:
>>> a = Test([1,2,3])
>>> a
Test ([1, 2, 3])
>>> a < 2 # calls __lt__
Test ([True, False, False])
>>> a[Test([True, False, False])] # calls __getitem__
Test ([1])
>>> a[a < 2] # or short form
Test ([1])
>>> a[a < 2] = 0 # calls __setitem__
>>> a
Test ([0, 2, 3])
Beachten Sie, dass dies nur eine Möglichkeit ist. Sie können fast alles implementieren, was Sie wollen.