Co chcę zrobić, to stworzyć klasę, która otacza int i pozwala na pewne rzeczy, które normalnie nie są dozwolone w typach int. Nie obchodzi mnie, czy to nie jest pythonic czy w/e, tylko szukam wyników. Oto mój kod:Automatyczne konwersje typów zdefiniowanych przez użytkownika klas
class tInt(int):
def __add__(self, other):
if type(other) == str:
return str(self) + str(other)
elif type(other) == int:
return int(self) + other
elif type(other) == float:
return float(self) + float(other)
else:
return self + other
a = tInt(2)
print (a + "5")
print ("5" + a)
Dane wyjściowe.
>> 25
Traceback (most recent call last):
File "C:\example.py", line 14, in <module>
print ("5" + a)
TypeError: Can't convert 'tInt' object to str implicitly
Tak więc pierwsza instrukcja drukowania przebiegła ładnie i dała to, czego się spodziewałem, ale druga dała błąd. Myślę, że to dlatego, że pierwszy używa funkcji tInt's add, ponieważ pojawił się przed + "5", a drugi po raz pierwszy użył funkcji "5" w postaci dodaj ponieważ pojawił się pierwszy. Wiem o tym, ale nie wiem, jak wymusić funkcję dodać lub pozwolić klasa tInt być reprezentowana jako ciąg/int/etc .., gdy normalny typ pojawia się przed nim w operacji.
Klauzula "else" spowoduje nieskończoną rekursję. 'self + other' wywoła' self .__ dodaj __ (inne) 'ponownie. – chepner
Cholera, nie myślałem o tym. Powinienem więc "oczyścić" wszystkie moje pozostałe, upewniając się, że jaźń jest innego rodzaju? – tatatat0
Zamiast tego należy użyć 'return NotImplemented'. Spowoduje to, że Python wypróbuje 'tInt .__ radd __ (other)' ifto jest zdefiniowany lub wypróbuje 'type (other) .__ add __ (self)' if not. – chepner