view pyikriam/utils.py @ 232:978a949602e5

Auto-update Scientists numbers for Academy. Refined the rules for safehouse, the safe house must be same or higher level then Town Hall. Make people very happy, when the townHall is less then 16. Build museum first then tavern THG: changed warfare.pl
author "Rex Tsai <chihchun@kalug.linux.org.tw>"
date Thu, 06 Nov 2008 20:31:05 +0800
parents 7551342718b6
children
line wrap: on
line source

## \brief decorator is a class decorate another of another object.
#
# Access of attributes/methods that can not be found in an instance
# of a class of this meta-class, decorator, are delegated to the backend
# of the instance.
#
# A backend object always passed as first parameter when
# instantiate an instance of a class with decorator as meta-class.
# For example,
# \code
# class foo(object):
#     __metaclass__ = decorator
#
# backend.data = 3
# obj = foo(backend)
# print obj.data
# backend.data = 4
# print obj.data
# \endcode
# it print out 3 and 4 respectively.
# 
class decorator(type):
    def __init__(clz, name, base, dict):
        super(decorator, clz).__init__(name, base, dict)
        clz.__getattr__ = decorator.__dele_getattr
        pass

    @staticmethod
    def set_backend(obj, backend):
        obj.__backend = backend
        pass

    @staticmethod
    def __dele_getattr(obj, name):
        return getattr(obj.__backend, name)
    pass


## \brief Decorator to make functions or methods dynamic programming.
#
# dyna_prog result of functions or methods with their arguments as key.
# It supposes result of a function always the same if the same arguments
# are passed.  It cache result of cached function to avoid really calling
# function every time.
class dyna_prog(object):
    class functor(object):
        def __init__(self, instance, method):
            self._method = method
            self._instance = instance
            self._cache = {}
            pass

        def __call__(self, *args):
            try:
                return self._cache[args]
            except KeyError:
                pass
            instance = self._instance
            result = self._method(instance, *args)
            return self._cache.setdefault(args, result)

        def clear(self):
            self._cache.clear()
        pass

    def __init__(self, method):
        super(dyna_prog, self).__init__()
        self._method = method
        self._functors = {}
        pass
    
    def __get__(self, instance, owner):
        try:
            return self._functors[instance]
        except KeyError:
            pass
        functor_o = dyna_prog.functor(instance, self._method)
        return self._functors.setdefault(instance, functor_o)
    pass