Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

__getattr__ for static/class variables in python

I have a class like:

class MyClass:      Foo = 1      Bar = 2 

Whenever MyClass.Foo or MyClass.Bar is invoked, I need a custom method to be invoked before the value is returned. Is it possible in Python? I know it is possible if I create an instance of the class and I can define my own __getattr__ method. But my scnenario involves using this class as such without creating any instance of it.

Also I need a custom __str__ method to be invoked when str(MyClass.Foo) is invoked. Does Python provide such an option?

like image 293
Tuxdude Avatar asked Jul 01 '10 06:07

Tuxdude


1 Answers

__getattr__() and __str__() for an object are found on its class, so if you want to customize those things for a class, you need the class-of-a-class. A metaclass.

class FooType(type):     def _foo_func(cls):         return 'foo!'      def _bar_func(cls):         return 'bar!'      def __getattr__(cls, key):         if key == 'Foo':             return cls._foo_func()         elif key == 'Bar':             return cls._bar_func()         raise AttributeError(key)      def __str__(cls):         return 'custom str for %s' % (cls.__name__,)  class MyClass:     __metaclass__ = FooType  # in python 3: # class MyClass(metaclass=FooType): #    pass   print MyClass.Foo print MyClass.Bar print str(MyClass) 

printing:

foo! bar! custom str for MyClass 

And no, an object can't intercept a request for a stringifying one of its attributes. The object returned for the attribute must define its own __str__() behavior.

like image 166
Matt Anderson Avatar answered Oct 29 '22 15:10

Matt Anderson