'Call a method n times by appending it to itself in a python object
Say i have a python class Sum() with a method add() that can take a list of numbers for manipulation, say
sum = Sum()
sum.add([5, 8, 2])
I want to instead call the .add method on each list item by 'appending' to itself. How can i achieve this?
sum.add(5).add(8).add(2)
For clarity, i have seen the two implementations in keras
model = tf.keras.Sequential([
hub_layer,
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.Dense(1)
])
Which can also be represented as
model = tf.keras.Sequential()
model.add(hub_layer)
model.add(tf.keras.layers.Dense(16, activation='relu'))
model.add(tf.keras.layers.Dense(1))
I want to achieve the second for the above scenarios, whereby I call the .add method n times for each item I have in a list
Solution 1:[1]
in your add function, simply return object itself
def add(self, number: int):
# do your stuff
return self
this works because the next .add is going to be executed on the returned element of the previous .add (aka the object itself)
hope it helps :)
Solution 2:[2]
You can call the method add on Sum objects. Let's decompose the line
sum.add(5).add(8)
add(5) is applied to the Sum object sum.
add(8) must be applied to a Sum object as well, so sum.add(5) must return a Sum object as well.
In general the add method must return a Sum object
Solution 3:[3]
For being able to chain methods, you need the method to return the instance of the object (aka self). You can find some additional information here.
If you object sum has a method add, then you can write sum.add(x). However, you can't call add on anything, you can only call it on instances of this class Sum. So if you want to do sum.add(x).add(y), you need that sum.add(x) is an instance of Sum, so the add method should return a Sum instance. If you want the object itself to be modified (and not create another one), you need add to return self.
Solution 4:[4]
You need to have the add() method returning a Sum object for this to occur.
Here is a minimal example. (I named the class A because sum is a Python function and it is better not to confuse the two. )
class A:
def __init__(self, n=0):
self.value = n
def __repr__(self):
return str(self.value)
def add(self, a_list):
self.value += sum(a_list)
return self
x = A()
print(x)
x.add([3, 3])
print(x)
x.add([10,10]).add([1,1,1])
print(x)
Output:
0
6
29
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Ren |
| Solution 2 | Marco Balo |
| Solution 3 | |
| Solution 4 |
