1.声明
由于本人在复习基础知识,发现存在一个装饰器模式的东西,发现起始这就是一个方法,python中支持方法的传递
2.装饰器的简介
个人理解,装饰器本质就是一个方法,但是这个方法具有一个参数就是用来接收一个函数,在内部使用装饰器模式对方法进行扩展,并且这个方法可以其他的方法上使用:@+装饰器方法名称
3.一个简单的装饰器的demo
def show(func):
def show_that():
print("show_that")
func()
print("show_that")
return show_that
class User():
def __init__(self):
self.name = ""
self.age = 0
self.sex = ""
@staticmethod # 表示这个方法就是一个静态的方法
def desc():
print("这是一个人")
# 不加self表示这是一个静态的方法,但是idea会报红,使用@staticmethod就不会爆红
# def OK():
# print("123")
@show
def test():
print("test")
User.desc()
# User.OK()
print(1213)
test()
结果:
1.当前的@staticmethod就相当于一个装饰器
2.发现这个装饰器中返回的方法名,但是需要返回的结果为一个方法名
4.另外一个简化版的装饰器(可以传递参数)
# 使用当前的装饰器模式并传递当前的参数
def my_func(fun):
def show(args): # 使用参数的时候需要在内部的函数中声明参数
print("开始执行方法")
fun(args) # 这样才可以调用当前的函数,并把参数传递过去
print("调用方法后")
return show # 使用装饰器模式需要返回一个函数的名称
@my_func
def say(args):
print("say方法被调用")
print("args={}".format(args))
say("123")
结果:
1.发现传递参数的时候,装饰器中的参数名称不需要参数,但是装饰器内部的方法需要和被装饰的方法一致的参数数量,这样就可调用这个方法,并在装饰器中调用这个方法
2.注意当前的装饰器内部的方法,以及传递参数需要注意的地方
5.传递方法
# 使用当前的传递函数名称
def my_func(fun, args):
return fun(args)
result = my_func(int, "1")
print("当前的结果为:{},当前返回的结果的类型为:{}".format(result, type(result)))
# 这里的操作是成功的,由于当前的int是一个类,但是这个类可以使用构造函数方式
class Use:
def __init__(self, arg=""):
print("arg=" + arg)
my_func(Use, "hello 函数式编程")
结果:
1.可以利用构造函数方式实现类型的转换
6.总结
=1.当前的装饰器就是方法内部套用方法,然后返回方法名即可,接收参数为函数
2.可以使用@+装饰器的名称将需要被装饰的方法扩展
,一般相当于Java中的AOP
3.可以使用内建的函数方式实现对参数实现函数化操作
以上纯属个人见解,如有问题请联系本人!