class variables

Andre Meyer meyer at acm.org
Tue Aug 8 05:35:24 EDT 2006


On 7/31/06, Bruno Desthuilliers <onurb at xiludom.gro> wrote:
> Colin J. Williams wrote:
> > Andre Meyer wrote:
> >> Hi all
> >>
> >> I am trying to understand the magic of Python's class variables and
> >> tried the following code (see below).
> >>
> >> Just out of curiosity, I tried to define a property that provides
> >> access to a seemingly instance variable which is in fact a class
> >> variable.
>
> [...]
>
> I'm afraid there are too much problems with indentation in the posted
> code to give any serious answer.


So, here we go again (plain formatting).

The following code shows two versions of using class variables. The
first one uses the __class__ attribute directly and works. The second
one tries to hide the __class__ attibute with the help of a property,
which does not work, because an assignment in the instance replaces
the property with the assigned value.

Any idea how the second version could be fixed with either a property
and/or a decorator?

thanks for your help
André



class Value(object):
    def __init__(self, i):
        self.i = i

    def work(self):
        return 'done', self.i


print; print "*** Case A ***"; print

class ClassA(object):
    v = None

    def __init__(self, value):

        print '-', self.v
        self.__class__.v = Value(value)
        print '+', self.__class__.v

    @classmethod
    def value1(self):
        print self.v.work()
        return self.v

    def value2(self):
        print self.__class__.v.work()
        return self.__class__.v


va1 = ClassA(1)
va2 = ClassA(2)
print va1.value1()
print va1.value2()
print va1.v
print va1.__class__.v
print va1.v.work()


print "*** Case B ***"; print

class ClassB(object):

    def __set_v(self, v): self.__class__.__v = v
    def __get_v(self): return self.__class__.__v
    def __del_v(self): del self.__class__.__v
#    v = property(__get_v, __set_v, __del_v, 'make class variable')
    v = None

    def __init__(self, value):
        self.v = property(self.__get_v, self.__set_v, self.__del_v,
'make class variable')

        print '-', self.v
        self.v = Value(value)
        print '+', self.v

    @classmethod
    def value1(self):
        print self.v.work()
        return self.v

    def value2(self):
        print self.v.work()
        return self.v

vb1 = ClassB(1)
vb2 = ClassB(2)
print vb1.value2()
print vb1.v
print vb1.__class__.v
print vb1.v.work()


More information about the Python-list mailing list