class level properties

Charles D Hixson charleshixsn at earthlink.net
Sat Apr 12 19:33:44 EDT 2008


Arnaud Delobelle wrote:
> On Apr 12, 8:36 pm, Charles D Hixson <charleshi... at earthlink.net>
> wrote:
>   
>> I'm trying to construct read-only variables at the class level.  I've
>> been unsuccessful.  Any suggestions?
>>
>> Mixing @classmethod and @property doesn't appear to produce workable
>> code.  Ditto for mixing @classmethod and __getattr__.  (The property
>> approach compiles, but execution says that you can't execute properties.)
>>
>> I've got a rather large number of variables, so I don't want to define
>> function accessors for each of them, and I *REALLY* don't want to have
>> to access them as functions rather than variables or properties.
>>     
>
> Metaclasses, of course!
>
>   
>>>> class MetaX(type):
>>>>         
> ...     @property
> ...     def spam(self): return 'eggs'
> ...
>   
>>>> class X(object):
>>>>         
> ...      __metaclass__ = MetaX
> ...
>   
>>>> X.spam
>>>>         
> 'eggs'
>   
>
> HTH
>
> --
> Arnau
Thanks.  I can make that work.  Is it possible to move the entire 
implementation of the interpretation of  _valueMap, below, into 
properties in some similar way?  I'm referring to the part managed by 
__getattr__ below.
I want a hundred or so read-only variables, and I'm not sure the best 
way to achieve it.

class    MetaROVars(type):
    @property
    def    simple(self):
        return    "simple example working"


class test(object):
    __metaclass__    =    MetaROVars
    _valueMap    =    {
            "t1"    : (3,    "Concept decay rate", "[1, 99]"),
            "t2"    :    (10,    "TaskLink decay rate", "[1, 99]"),
            }
   
    #@classmethod
    def    __getattr__(self, name):
        if    name not in test._valueMap:
            raise AttributeError, name
        return    test._valueMap[name][0]

    def    describe    (self, name):
        if    name not in test._valueMap:
            raise AttributeError, name
        return    test._valueMap[name][1] + ", lying in the range " + 
test._valueMap[name][2]


p    =    test()
print    p.t1
print    p.describe("t1")
print    p.t2
print    test.simple




More information about the Python-list mailing list