装饰器用来装饰函数
如果一个函数有多个装饰器,那么,装饰顺序取决于离函数的远近距离(近的先装)
相关代码
def add_out1(func): print("装饰器开始装饰1") def add_in1(): return '《' + func() + "》" return add_in1 def add_out2(func): print("装饰器开始装饰2") def add_in2(): return '*' + func() + "*" return add_in2 @add_out1 #book_name = add_out1(book_name) @add_out2 #book_name = add_out2(book_name) def book_name(): return '7个男人与1个女人的故事' # book_name = add_out1(book_name) # print(book_name()) print(book_name())
装饰固定参数的函数
def func_out(func): def func_in(arg): func(arg) return func_in @func_out #func_1 = func_out(func_1) def func_1(a): print("a = %s"%a) # func_1(10) def func_out2(func): def func_in(a,b): func(a,b) return func_in @func_out2 #func_2 = func_out2(func_2) def func_2(a,b): print(a,b) func_2(1,2)
装饰不定个数参数的函数
def func_out(func): def func_in(*args): func(*args) return func_in @func_out def func_1(a): print(a) @func_out def func_2(a,b): print(a,b) @func_out def func_3(a,b,c): print(a,b,c) @func_out def func_0(): print("我没有参数") func_1(10) func_2(10,20) func_3(10,20,30) func_0()
通用装饰器装饰什么函数都好用
def func_out(func): def func_in(*args,**kwargs): print("日志记录") return func(*args,**kwargs) return func_in @func_out def func1(a): print(a) @func_out def func2(a,b): return a + b # print(func1(10)) @func_out #b,c为缺省参数 def func3(a,b=2,c=3): print(a,b,c) result = func2(10,20) print(result) print(func3(1,2,3))
对闭包的更深层的使用,与Java相比,个人理解,类装饰器替代了抽象类被继承,抽象方法被重写的情况。
class Test():
def __init__(self,func):
self.func = func
print("我是新增功能")
self.func()
#解决'Test' object is not callable
def __call__(self, *args, **kwargs):
pass
@Test
#test = Test(test)
def test():
print("我是测试函数")
# TypeError: 'Test' object is not callable
# test()
从上面的代码来看,有点像Java中23种设计模式中的模板方法模式
python的动态特性:
动态添加属性:成员属性,类属性
动态添加方法:成员方法,类方法,静态方法
python动态添加属性
class Student(): def __init__(self,name): self.name = name stu1 = Student('学生1') #动态添加属性 stu1.age = 18 #添加类属性 Student.cls_id = 210 #类属性的访问方式:1.类名.属性名 2.对象.属性名 stu2 = Student('学生2') print(Student.cls_id) print(stu2.cls_id)
python动态添加方法
成员方法 types.MethodType(函数,对象)
类方法
静态方法
class Student(): def __init__(self,name): self.name = name stu1 = Student('学生1') stu1.age = 18 Student.cls_id = 210 def study(self): print("学习使我快乐") #如何让一个函数跟类建立关系 # stu1.study = study # TypeError: study() missing 1 required positional argument: 'self' # stu1.study() import types # 将函数study与对象stu1绑定,手动告诉函数参数self指的是stu1 stu1.study = types.MethodType(study,stu1) stu1.study() @classmethod def testClsMethod(cls): print("我是类方法") #访问类属性 print(cls.cls_id) #动态添加类方法 Student.testClsMethod = testClsMethod Student.testClsMethod() @staticmethod def testStaticMethod(): print("我是静态方法") #动态添加静态方法: Student.testStaticMethod = testStaticMethod Student.testStaticMethod()
over......
备案号:湘ICP备19000029号
Copyright © 2018-2019 javaxl晓码阁 版权所有