dysentrieb
dysentrieb

Reputation: 1

How to iterate over class attributes?

I'm looking for a way to not repeat myself in lines 10 to 14. This is always the same code and my real code is more complex. What can I do about this?

01    class MyValues:
02        def __init__(self, a, b, c, d, e):
03            self.a = a
04            self.b = b
05            self.c = c
06            self.d = d
07            self.e = e
08
09    def add_number(values: MyValues, number_to_add):
10        values.a += number_to_add
11        values.b += number_to_add
12        values.c += number_to_add
13        values.d += number_to_add
14        values.e += number_to_add
15        return values

Upvotes: 0

Views: 4977

Answers (3)

Matt N.
Matt N.

Reputation: 63

You could store your values in a list instead. Looping over all the values then becomes relatively simple. Plus, you won't have to manually add each value to the class.

class MyValues:
    def __init__(self, value_list ):
        self.values = value_list
        self.num_of_values = len(self.values)
    
    def add_number(self, number_to_add):
        for index in range(self.num_of_values):
            self.values[index] += number_to_add
        return self.values

def main():
    myVals = MyValues( [1, 2, 3, 4, 5] )
    print( myVals.add_number(10) )
    
if __name__ == '__main__':
    main()

Output:

[11, 12, 13, 14, 15]

Upvotes: 0

Z Li
Z Li

Reputation: 4318

This would work if all your attributes need to be added:

class MyValues:
    def __init__(self, a, b, c, d, e):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        
    # should name the first arg to be self
    def add_number(self, number_to_add):
        for k in self.__dict__:
            setattr(self, k, getattr(self, k) + number_to_add)
        return self

But like @Barmar said you should consider to add them as a list or dict in the first place

Upvotes: 3

XxJames07-
XxJames07-

Reputation: 1826

you could use dictionaries like this:

01 class MyValues:
02     def __init__(self, a, b, c, d, e):
03         self.vals = {"a":a,"b":b,"c":c,"d":d,"e":e}
04    
05     def add_number(self,values: MyValues, number_to_add):
06         for value in values.vals:
07             values.vals[value]+=number_to_add
08         return values

Upvotes: 0

Related Questions