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)
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.
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.
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.
In Python, we use a dot (.) operator to access the members of a class.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With