Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where is it better to declare variables within a Python class?

When I write a class, I declare a some variables within the __init__ method and some other in the other functions. So, I usually end up with something like this:

class Foo:
    def __init__(self,a, b):
        self.a=a
        self.b=b
    def foo1(self,c, d)
        sum=self.a+self.b+c+d
        foo2(sum)
    def foo2(self,sum)
        print ("The sum is ", sum)

I find this way a bit messy because it gets difficult to keep track of all variables. In contrary, managing variables when they are declared within the __init__ method becomes more easy. So, instead of the previous form, we would have:

class Foo:
    def __init__(self,a, b, c, d, sum):
        self.a=a
        self.b=b
        self.c=c
        self.d=d
        self.sum=sum
    def foo1(self)
        self.sum=self.a+self.b+self.c+self.d
        foo2(self.sum)
    def foo2(self)
        print ("The sum is ", self.sum)

Which one would you choose and why? Do you think declaring all the variables of all functions of the class in the __init__ method would be a better practice?

like image 966
multigoodverse Avatar asked Jan 13 '23 04:01

multigoodverse


2 Answers

Your sum is a good candidate for a computed value i.e. method that acts like class variable (not method). This can be done by @property

class Foo(object):
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def sum(self)
        return self.a + self.b

f = Foo(1, 2)
print 'The sum is' + f.sum

http://docs.python.org/2/library/functions.html#property

like image 146
alexvassel Avatar answered Jan 29 '23 11:01

alexvassel


There are at least three aspects to this:

  • From a design standpoint your constructor should only define variables, that are used at least in two methods in your class or that convey an essential characteristic of the thing you try to model.
  • From a performance point of view, you should use variables with the smallest scope possible, it saves lookups.
  • Keeping the variables local, keeps the cognitive load low.
like image 37
miku Avatar answered Jan 29 '23 11:01

miku