I am trying to add a class object with a number, but I'm confused on how to go about adding a class object with two numbers. For example, this is my hypothetical add class method:

class A: def __add__(self, b): return something 

I know how to add this so far:

a = A() print(a + 1) 

But, what if I want to add it like this?

a = A() print(a + 1 + 2) 

Should I use *args for the add class method?

4 Answers

No, you can't use multiple arguments. Python executes each + operator separately, the two + operators are distinct expressions.

For your example, object + 1 + 2 really is (object + 1) + 2. If (object + 1) produces an object that has an __add__ method, then Python will call that method for the second operator.

You could, for example, return another instance of A here:

>>> class A: ... def __init__(self, val): ... self.val = val ... def __repr__(self): ... return f'<A({self.val})>' ... def __add__(self, other): ... print(f'Summing {self} + {other}') ... return A(self.val + other) ... >>> A(42) + 10 Summing A(42) + 10 <A(52)> >>> A(42) + 10 + 100 Summing A(42) + 10 Summing A(52) + 100 <A(152)> 
4

You would want your return value to be an object itself, that also supports the add operation, e.g.:

class A: def __init__(self, value=0): self.value = value def __add__(self, b): return A(self.value + b) def __str__(self): return str(self.value) a = A() print(a + 1 + 2) 

Output:

3

It perfectly works even with multiple values since each add only adds two values (see the multiple + signs when you ad multiple values):

class A: def __init__(self, value): self.a = value def __add__(self, another_value): return self.a + another_value a = A(1) print(a+1+1) 
2

you could always just do this:

>>> class A: ... def __init__(self, val): ... self.val = val ... def __repr__(self): ... return f'<A({self.val})>' ... def __add__(self, other): ... print(f'Summing {self} + {other}') ... return A(self.val + other) ... >>> A(42) + 10 Summing A(42) + 10 <A(52)> >>> A(42) + 10 + 100 Summing A(42) + 10 Summing A(52) + 100 <A(152)>>>> class A: ... def __init__(self, val): ... self.val = val ... def __repr__(self): ... return f'<A({self.val})>' ... def __add__(self, other): ... print(f'Summing {self} + {other}') ... return A(self.val + other) ... >>> A(42) + 10 Summing A(42) + 10 <A(52)> >>> A(42) + 10 + 100 Summing A(42) + 10 Summing A(52) + 100 <A(152)> 
1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy