Using metaclasses to inherit class variables

Steven Bethard steven.bethard at gmail.com
Sat May 20 01:39:20 EDT 2006


telesphore4 at gmail.com wrote:
> I want to inherit fresh copies of some class variables. So I set up a
> metaclass and meddle with the class variables there.
> 
> Now it would be convenient to run thru a dictionary rather than
> explicitly set each variable. However getattr() and setattr() are out
> because they chase the variable thru the class hierarchy.

getattr() does, setattr() doesn't.

> Is there an easy way around this? Or am I stuck listing out the
> variables one per line?
> 
> class SetClassVars(type):
>     cvars = dict(name=None, desc=None, required=True, minlen=1,
>                  maxlen=25, idDown=999999999, idNext=0)
>     def __init__(cls, name, bases, dict):
>         if not cls.__dict__.has_key('name'):     cls.name     = None
>         if not cls.__dict__.has_key('desc'):     cls.desc     = None
>         if not cls.__dict__.has_key('required'): cls.required = True
>         if not cls.__dict__.has_key('minlen'):   cls.minlen   = 1
>         if not cls.__dict__.has_key('maxlen'):   cls.maxlen   = 25
>         if not cls.__dict__.has_key('idDown'):   cls.idDown = 999999999
>         if not cls.__dict__.has_key('idNext'):   cls.idNext   = 0

Does this do what you want?  Note that I don't even bother with __dict__ 
since the class dict is already available as the final argument to __init__.

 >>> class SetClassVars(type):
...     cvars = dict(name=None, desc=None, required=True)
...     def __init__(cls, name, bases, classdict):
...         for name, value in SetClassVars.cvars.iteritems():
...             if not name in classdict:
...                 setattr(cls, name, value)
...
 >>> class C(object):
...     __metaclass__ = SetClassVars
...     name = 'foo'
...
 >>> class D(C):
...     __metaclass__ = SetClassVars
...     desc = 'bar'
...
 >>> print C.name, C.desc, C.required
foo None True
 >>> print D.name, D.desc, D.required
None bar True


STeVe



More information about the Python-list mailing list