# _*_ coding: utf-8 _*_ """ python_decorator.py by xianhu """ import functools # æå»ºä¸å¸¦åæ°çè£ é¥°å¨ def logging(func): @functools.wraps(func) def decorator(*args, **kwargs): print("%s called" % func.__name__) result = func(*args, **kwargs) print("%s end" % func.__name__) return result return decorator # 使ç¨è£ é¥°å¨ @logging def test01(a, b): print("in function test01, a=%s, b=%s" % (a, b)) return 1 # 使ç¨è£ é¥°å¨ @logging def test02(a, b, c=1): print("in function test02, a=%s, b=%s, c=%s" % (a, b, c)) return 1 # æå»ºå¸¦åæ°çè£ é¥°å¨ def params_chack(*types, **kwtypes): def _outer(func): @functools.wraps(func) def _inner(*args, **kwargs): result = [isinstance(_param, _type) for _param, _type in zip(args, types)] assert all(result), "params_chack: invalid parameters" result = [isinstance(kwargs[_param], kwtypes[_param]) for _param in kwargs if _param in kwtypes] assert all(result), "params_chack: invalid parameters" return func(*args, **kwargs) return _inner return _outer # 使ç¨è£ é¥°å¨ @params_chack(int, (list, tuple)) def test03(a, b): print("in function test03, a=%s, b=%s" % (a, b)) return 1 # 使ç¨è£ é¥°å¨ @params_chack(int, str, c=(int, str)) def test04(a, b, c): print("in function test04, a=%s, b=%s, c=%s" % (a, b, c)) return 1 # å¨ç±»çæåæ¹æ³ä¸ä½¿ç¨è£ é¥°å¨ class ATest(object): @params_chack(object, int, str) def test(self, a, b): print("in function test of ATest, a=%s, b=%s" % (a, b)) return 1 # åæ¶ä½¿ç¨å¤ä¸ªè£ é¥°å¨ @logging @params_chack(int, str, (list, tuple)) def test05(a, b, c): print("in function test05, a=%s, b=%s, c=%s" % (a, b, c)) return 1 # æå»ºä¸å¸¦åæ°çè£ é¥°å¨ç±» class Decorator(object): def __init__(self, func): self.func = func return def __call__(self, *args, **kwargs): print("%s called" % self.func.__name__) result = self.func(*args, **kwargs) print("%s end" % self.func.__name__) return result # 使ç¨è£ é¥°å¨ @Decorator def test06(a, b, c): print("in function test06, a=%s, b=%s, c=%s" % (a, b, c)) return 1 # æå»ºå¸¦åæ°çè£ é¥°å¨ç±» class ParamCheck(object): def __init__(self, *types, **kwtypes): self.types = types self.kwtypes = kwtypes return def __call__(self, func): @functools.wraps(func) def _inner(*args, **kwargs): result = [isinstance(_param, _type) for _param, _type in zip(args, self.types)] assert all(result), "params_chack: invalid parameters" result = [isinstance(kwargs[_param], self.kwtypes[_param]) for _param in kwargs if _param in self.kwtypes] assert all(result), "params_chack: invalid parameters" return func(*args, **kwargs) return _inner # 使ç¨è£ é¥°å¨ @ParamCheck(int, str, (list, tuple)) def test07(a, b, c): print("in function test06, a=%s, b=%s, c=%s" % (a, b, c)) return 1 # è£ é¥°å¨å®ä¾: 彿°ç¼å def funccache(func): cache = {} @functools.wraps(func) def _inner(*args): if args not in cache: cache[args] = func(*args) return cache[args] return _inner # 使ç¨è£ é¥°å¨ @funccache def test08(a, b, c): # å ¶ä»å¤ææèæ¶è®¡ç® return a + b + c # 使ç¨Pythonèªå¸¦çè£ é¥°å¨ @property class Person(object): def __init__(self): self._name = None return def get_name(self): print("get_name") return self._name def set_name(self, name): print("set_name") self._name = name return name = property(fget=get_name, fset=set_name, doc="person name") # 使ç¨Pythonèªå¸¦çè£ é¥°å¨ @property class People(object): def __init__(self): self._name = None self._age = None return @property def name(self): return self._name @name.setter def name(self, name): self._name = name return @property def age(self): return self._age @age.setter def age(self, age): assert 0 < age < 120 self._age = age return # ç±»éææ¹æ³åç±»æ¹æ³ class A(object): var = 1 def func(self): print(self.var) return @staticmethod def static_func(): print(A.var) return @classmethod def class_func(cls): print(cls.var) cls().func() return