44

Let's say I create an instance of a class and want to assign some values to its public properties. Usually, this would be done like this:

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None

myclass = MyClass()
myclass.name = 'My name'

But, what if a write a function that takes a class as parameter and I would like to assign some values to the public properties of that class dynamically - that is via variables and loops (without knowing how many there are or what they are called.)

The obvious would be:

myclass = MyClass()
myclass['name'] = "My name"

But that doesn't work.

Any ideas?

Honza Pokorny
  • 3,135
  • 5
  • 36
  • 41
  • Also, this is a duplicate: http://stackoverflow.com/questions/1167398/python-access-class-property-from-string – S.Lott Mar 11 '10 at 13:47

3 Answers3

56
setattr(my_class_instance, 'attr_name', attr_value)
shylent
  • 9,966
  • 6
  • 36
  • 54
18

After reading rejected Syntax For Dynamic Attribute Access I'm using a mixin class providing dictionary-style access to an object's attributes :

class MyClass:
    def __init__(self):
        self.name = None
        self.text = None
    def __getitem__(self, name):
        return getattr(self, name)
    def __setitem__(self, name, value):
        return setattr(self, name, value)
    def __delitem__(self, name):
        return delattr(self, name)
    def __contains__(self, name):
        return hasattr(self, name)

While still being able to set attributes directly:

myclass = MyClass()
myclass.name = "foo"
myclass.text = "bar"

it's then possible to set them dynamically :

for attr in ('name', 'text'):
    myclass[attr] = confirm(attr, default=myclass[attr])
r2rien
  • 291
  • 2
  • 4
1

Using dir with setattr should do the job

class MyClass:
  def __init__(self):
    self.name = None
    self.text = None

myclass = MyClass()
myclass.name = 'My name'

for prop in dir(myclass):
    print '%s:%s'%(prop,getattr(myclass,prop))

print

for prop in dir(myclass):
    if prop[:2]!='__' and prop[-2:]!='__':
        print prop[-2:]
        setattr(myclass,prop,"Foo Bar")

for prop in dir(myclass):
    print '%s:%s'%(prop,getattr(myclass,prop))    

But be careful because this code also sets '__doc__', '__init__', '__module__' properties to "Foo Bar". So you will have to take care of avoiding certain things given to you by dir (especially those which start and end with __ double underscores).

Pratik Deoghare
  • 33,028
  • 29
  • 96
  • 145