Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python importing class attributes into method local namespace

I have been wondering for a while if there is easier way to assign class attributes to method local namespace. For example, in dosomething method, I explicitly make references to self.a and self.b:

class test:
    def __init__(self):
        self.a = 10
        self.b = 20

    def dosomething(self):
        a = self.a
        b = self.b
        return(a + b)

But sometimes I have a lot of variables (more than 10) and it gets messy to type and look at - I would have bunch of var = self.var statements at the beginning of a method.

Is there any way to do this more compact way? (I know updating local() is not a good idea)

Edit: Ideally, what I want is:

def dosomething(self):
    populate_local_namespace('a', 'b')
    return(a + b)
like image 408
joon Avatar asked Jun 09 '13 03:06

joon


People also ask

How do you access a class attribute in Python?

Attributes of a class can also be accessed using the following built-in methods and functions : getattr() – This function is used to access the attribute of object. hasattr() – This function is used to check if an attribute exist or not. setattr() – This function is used to set an attribute.

How do you access class variables outside class in Python?

The variables that are defined outside the class can be accessed by any class or any methods in the class by just writing the variable name.

Can a class attribute be used without an instance of that class in Python?

while you can access class attributes using an instance it's not safe to do so. In python, the instance of a class is referred to by the keyword self. Using this keyword you can access not only all instance attributes but also the class attributes.

How do you access other members of a class from within a class in Python?

In Python, we use a dot (.) operator to access the members of a class.


1 Answers

Q. Is there any way to do this more compact way?

1. If the variables are read-only, it would be reasonably Pythonic to factor-out a multi-variable accessor method:

class Test:

    def __init__(self):
        self.a = 10
        self.b = 20
        self.c = 30

    def _read_vars(self):
        return self.a, self.b, self.c

    def dosomething(self):
        a, b, c = self._read_vars()
        return a + b * c

    def dosomethingelse(self):
        a, b, c = self._read_vars()
        return a - b * c

If the variables aren't read-only, it is best to stick with self.inst_var = value. That is the normal way to write Python code and is usually what most people expect.


2. Once in a while you will see people abbreviate self with a shorter variable name. It is used when the readability benefits of decluttering outweigh the readability cost of using a non-standard variable name:

def updatesomethings(s):
    s.a, s.b, s.c = s.a + s.c, s.b - s.a, s.c * s.b

3. Another way to handle a very large number instance variable is to store them in a mutable container for ease of packing and unpacking:

class Test:

    def __init__(self, a, b, c, d, e, f, g, h, i):
        self._vars = [a, b, c, d, e, f, g, h, i]

    def fancy_stuff(self):
        a, b, c, d, e, f, g, h, i = self._vars
        a += d * h - g
        b -= e * f - c
        g = a + b - i
        self._vars[:] = a, b, c, d, e, f, g, h, i

4. There is also a dictionary manipulation approach that would work, but it has a code smell that most Pythonistas would avoid:

def updatesomethings(self):
    a = 100
    b = 200
    c = 300
    vars(self).update(locals())
    del self.self
like image 116
Raymond Hettinger Avatar answered Sep 28 '22 08:09

Raymond Hettinger