Given jest następujący przykład:Python klasy z całkowitej emulacji
class Foo(object):
def __init__(self, value=0):
self.value=value
def __int__(self):
return self.value
chcę mieć klasę Foo, który działa jako liczba całkowita (lub float). Więc chcę zrobić następujące rzeczy:
f=Foo(3)
print int(f)+5 # is working
print f+5 # TypeError: unsupported operand type(s) for +: 'Foo' and 'int'
Pierwsze oświadczenie print int(f)+5
pracuje, bo są dwie liczby całkowite. Druga nie działa, ponieważ muszę wykonać __add__
, aby wykonać tę operację z moją klasą.
Aby zaimplementować zachowanie liczby całkowitej, muszę zaimplementować wszystkie metody emulacji liczb całkowitych. Jak mogę to obejść. Próbowałem odziedziczyć po int
, ale ta próba zakończyła się niepowodzeniem.
Aktualizacja
Dziedziczenie z int
nie powiedzie się, jeśli chcesz używać __init__
:
class Foo(int):
def __init__(self, some_argument=None, value=0):
self.value=value
# do some stuff
def __int__(self):
return int(self.value)
Jeśli następnie zadzwonić:
f=Foo(some_argument=3)
otrzymasz:
TypeError: 'some_argument' is an invalid keyword argument for this function
Testowane z Python 2.5 i 2.6
Nie rozumiem twojego pytania. Jak możesz obejść jedną rzecz, którą musisz zrobić, aby nie zrobić jedynej rzeczy, którą musisz zrobić? Fishslap! –
Chcę, aby klasa działała jak liczba całkowita. Implementacje rzeczywistych liczb całkowitych są zawsze takie same, więc po co je wdrażać za każdym razem, gdy z niego korzystasz. Metoda __add__ ma sens, gdy używasz operatora "+" dla wszystkiego innego niż prawdziwy dodatek. –