def a(): def b(): print('hello') b() a() b() # 错误
装饰器的用法,相当于把b函数放到a函数中,在a函数的内部调用b函数,然后在最外层调用a函数。
语法规则如下
def out(func_args): # 外围函数 def inter(*args, **kwargs): # 内嵌函数 return func_args(*args, **kwargs) return inter # 外围函数返回内嵌函数
方法一
def a(func): def b(*args, **kwargs): return func(*args, **kwargs) return b def c(name): print(name) a(c)('xiaom')
方法二
@a def c(name): print(name) c('xm')
装饰器的案例
# coding:utf-8 def check_str(func): print('func:', func) def inner(*args, **kwargs): print('args:', args, kwargs) result = func(*args, **kwargs) if result == 'ok': return 'result is %s' % result else: return 'result is failed:%s' % result return inner @check_str def test(data): return data result = test(data='no') print(result) result = test(data='ok') print(result)
1. classmethod的功能
用法: @classmethod def func(cls, ...): do 参数介绍: cls 替代普通类函数中的self, 变为cls,代表当前操作的是类
class Test(object): @classmethod def add(cls, a, b): return a + b Test.add(1, 2)
class Test(object): def __init__(self, a): # 构造函数 self.a = a def run(self): print('run') self.dump() @classmethod def dump(cls): print('dump') # cls.run() t = Test('a') t.run() # Test.dump()
2. staticmethod的功能
-将类函数可以不经过实例化而直接被调用,被该装饰器调用的函数不许传递self或cls参数,且无法在该函数内调用其他类函数或类变量。
用法: @staticmethod def func(...): do 参数介绍: 函数体内无cls或者self参数
class Test(object): @staticmethod def add(a, b): return a + b Test.add(1, 2)
class Test(object): def __init__(self, a): # 构造函数 self.a = a def run(self): print('run') self.dump() self.sleep() @classmethod def dump(cls): print('dump') # cls.run() @staticmethod def sleep(): print('I wanna sleep') t = Test('a') t.run() Test.sleep() t.sleep() t.dump()
3. property的功能
用法: @property def func(self): do 参数介绍: 一般遵照定义,不对函数传参。 如果一定要传参的话进行重写property调用的函数,函数名必须要一样,而且需要重写装饰器,在原有函数名的基础上加".setter",这样就可以传入参数了。
class Test(object): def __init__(self, name):
class Test1(object): def __init__(self, name): self.__name = name @property def name(self): return self.__name @name.setter def name(self, value): self.__name = value t1 = Test1(name='xm') print(t1.name) t1.name = 'gg' print(t1.name)