tmdag tmdag - 15 days ago 6
Python Question

dynamic attribute within class

I have situation where (pseudo code):

class MyClass:
def __init___(self):
self.varA = [zza, b, c]
self.varB = [d, e, zzf]
def process(self):
self.varA = ["zz" + w for w in self.varA if "zz" not in self.varA]
self.varB = ["zz" + w for w in self.varB if "zz" not in self.varB]
print varA, varB


What I would like to have is something more elegant, where I could pass variable to process through definition:

class MyClass:
def __init___(self):
self.varA = [zza, b, c]
self.varB = [d, e, zzf]
def addZZ(list):
return list = ["zz" + w for w in list if "zz" not in list]
def process(self):
self.addZZ(varA)
self.addZZ(varB)
print self.varA, self.varB


But that would mean it has to dynamically change attribute within that def ? How can I approach it ?

Answer

You could write it like this:

class MyClass:
   def __init___(self):
      self.varA = [zza, b, c]
      self.varB = [d, e, zzf]
   def addZZ(varname):
      _list = getattr(self, varname)
      setattr(self, varname, ["zz" + w for w in _list if "zz" not in _list])
   def process(self):
      self.addZZ('varA')
      self.addZZ('varB')
      print self.varA, self.varB

Using setattr and getattr to access attributes by their names.

Also as the filter does not depend on the items but only the list. It can be hoisted out of the list comprehension and placed outside. It then becomes clear that if "zz" is in the list that the list is emptied.

   def addZZ(varname):
      _list = getattr(self, varname)
      if "zz" not in _list:
          setattr(self, varname, ["zz" + w for w in _list])
      else:
          setattr(self, varname, [])