Dynamic property names on class

Diez B. Roggisch deets at nospam.web.de
Fri Nov 13 12:34:58 EST 2009


Bryan schrieb:
> I have several properties on a class that have very similar behavior.
> If one of the properties is set, all the other properties need to be
> set to None.  So I wanted to create these properties in a loop like:
> 
> class Test(object):
> 	for prop in ['foo', 'bar', 'spam']:
> 		# Attribute that data is actually stored in
> 		field = '_' + prop
> 		# Create getter/setter
> 		def _get(self):
> 			return getattr(self, field)
> 		def _set(self, val):
> 			setattr(self, field, val)
> 			for otherProp in prop:
> 				if otherProp != prop: setattr(self, '_' + otherProp, None)
> 		# Assign property to class
> 		setattr(Test, prop, property(_get, _set))
> 
> t = Test()
> t.foo = 1
> assert t.bar == t.spam == None
> 
> But the class Test is not defined yet, so I can't set a property on
> it.  How can I do this?

With a metaclass, or a post-class-creation function. Which is a 
metaclass without being fancy.

Just put your above code into a function with the class in question as 
argument, and invoke it after Test is defined.

Diez



More information about the Python-list mailing list