instance/class methods: having my cake and eating it too

Donnal Walter donnal at
Thu Aug 29 07:28:14 EDT 2002

To enforce 'encapsulation' of a class attribute, I would like to
define a class method that sets that class attribute (format):

class Decimal:

    format = '%.0f'   # default format is for integer printing

    def GetFormat(self):
        return self.format

    def SeeFormat(self):
        print self.GetFormat()

    def SetDigits(cls, digits):
        digits = min(digits, 5)
        cls.format = "%%.%uf" % digits

    SetDigits = classmethod(SetDigits)

class Weight(Decimal):


>>> x = Weight()
>>> x.SeeFormat()

But I also want to be able to override this class attribute with an
instance attribute that is set using an instance method:

    def InstanceSetDigits(self, digits):
        digits = min(digits, 5)
        self.format = "%%.%uf" % digits

class MyContainer:

    def __init__(self):
        self.wt = Weight()

>>> y = MyContainer()
>>> y.wt.SeeFormat()

This works, but having both SetDigits and InstanceSetDigits is
redundant code and makes for a confusing API. Is there any way I can
define ONE method that works like a class method when called from the
base class object and like an instance method when called from an

More information about the Python-list mailing list