装饰器用来装饰函数
如果一个函数有多个装饰器,那么,装饰顺序取决于离函数的远近距离(近的先装)
相关代码
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晓码阁 版权所有