Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Computed static property in python

Is it possible to have a static property on a class that would be computed as a one off. The idea would be to be able to do it like so:

class Foo:
    static_prop = Foo.one_off_static_method()

    @staticmethod
    def one_off_static_method():
        return 'bar'

I thought of using __new__ as well.

Class Foo:
    def __new__(cls):
         cls.static_prop = ... do everything here

Not sure the implications of that though.

like image 351
mkohram Avatar asked Sep 14 '16 20:09

mkohram


1 Answers

If you want it computed at class definition time, see chepner's answer - although I would recommend just to use a module level function instead.

If you want it lazily evaluated, then you might be interested in a cached_property.

>>> from random import random
>>> from cached_property import cached_property
>>> class Foo(object):
...     @cached_property
...     def one_off_thing(self):
...         print('computing...')
...         return random()
...     
>>> foo = Foo()
>>> foo.one_off_thing
computing...
0.5804382038855782
>>> foo.one_off_thing
0.5804382038855782

Note: it seems every man and his dog has an implementation of memo decorators in Python, this is one of many. If you're on Python 3, consider functools.lru_cache because it's in the core libraries.

like image 196
wim Avatar answered Sep 26 '22 18:09

wim