Я новичок, поэтому, пожалуйста, извините нестандартную терминологию и дайте мне знать, если я должен добавить код, чтобы сделать этот вопрос более ясным.Как сказать Python, что мы всегда хотим интерпретировать объект типа Foo как объект типа Bar при конфликтах?
Предположим, что мы пытаемся создать класс «Rational» в Python. (Я знаю, что один уже встроен, но игнорировать, что для целей данного вопроса.)
Мы можем использовать __add__
и __mul__
, например, научить Python, как интерпретировать код формы a + b
или a * b
,
, где a
и b
- Rationals.
Теперь может случиться так, что в другом месте нужно вычислить a + b
, где a
является рациональным, но b
является целым числом. Это можно сделать, изменив наш __add__
код в Rational класса включают в себя, если заявление, например,
def __add__(self, b):
if isinstance(b, int):
brat = rational(b, 1)
return self + brat
else:
y = rational(self.num*b.den + b.num*self.den , b.den*self.den)
y = y.lowest_terms()
return y
Аналогичным образом можно изменить наш __mul__
код, наш __div__
код и т.д. Но есть, по крайней мере, две проблемы с таким видом решения:
- Это работает только тогда, когда второй аргумент
int
. Первый аргумент по-прежнему должен быть Rational; не существует способа написать метод в классе Rational, который позволяет нам добавитьa + b
, где a - int и be - это Rational. - Это повторяющийся. Мы действительно хотим, чтобы какой-то метод мог сказать один раз, глобально, в некотором роде, «всякий раз, когда вы пытаетесь выполнить операцию на нескольких объектах, некоторые из которых являются Rationals, а некоторые являются целыми числами, обрабатывают целые числа как Rationals путем сопоставления n с Rational (n, 1). "
Существует ли такая методика? (Я отметил это принуждение, потому что я думаю, что это то, что называется принуждением в других контекстах, но я понимаю, что принуждение устарело в Python.)
комментарий на 1 .: есть ['__radd__()'] (https://docs.python.org/2/reference/datamodel.html#object.__radd__) (и аналогичный), который вы можете реализовать для своих «Rationals» таким образом, что «integer + rational» будет работать. –