Я хочу знать, почему магическая функция дает конкретный ответ для конкретного оператора - PullRequest
1 голос
/ 11 октября 2019

Я использовал магические функции (перегрузка операторов) в Python, когда узнал, что для конкретного оператора Python дает определенный ответ

class over:
    def __init__(self,x):
        self.x=x
    def __add__(self,other):
        return over(self.x+other.x)
ob1=over(20)
ob2=over(30)
ob3=over(40)
ob4=ob1+ob2+ob3              #It Is adding All three
print(ob4.x)           # This Gave Me answer As 90

Но когда я использовал другую магическую функцию, например, Greater( gt ) Это были просто дополнительные два значения, а именно ob2 и ob3

class over:
def __init__(self,x):
    self.x=x
def __gt__(self,other):
    return over(self.x+other.x)
ob1=over(20)
ob2=over(30)
ob3=over(40)
ob4=ob1>ob2>ob3     # This Is Just Adding Ob2 and Ob3
print(ob4.x)          #Result:70      

Я хочу получить результат 90 Как я получил в своем первом коде, используя gt

1 Ответ

2 голосов
/ 11 октября 2019

Цепочка для операторов сравнения происходит немного по-другому, чем +

a < b < c

эквивалентно

a < b and b < c

Таким образом, ваше выражение фактически оценивается как:

(ob1 < ob2) and (ob2 < ob3)

Что дает

over(x=70)

Из-за того, как работает оператор and.

Чтобы выражение работало, вам нужно добавить несколько скобок:

(ob1 > ob2) > ob3

, что дает:

over(x=90)

Ref: https://www.geeksforgeeks.org/chaining-comparison-operators-python/

...