这是我参与更文挑战的第 30 天,活动详情查看: 更文挑战
1. 概述
装饰器是使用@符号引用已有的函数后,可用于修饰其他函数装饰被修饰的函数。
当程序使用“@函数”(比如函数A)装饰另一个函数(比如函数B)时,有两步:
- 将被修饰的函数(函数B)作为参数传给@符号引用的函数(函数A)
- 将函数B替换(装饰)成第1步的返回值
最后,被“@函数”修饰的函数不再是原来的函数,而是被替换换成一个新东西。
装饰器分为步内置装饰器和自定义装饰器。
- @classmethod,修饰的方法就是类方法
- @staticmethod,修饰的方法是静态方法
- @property,将方式调用变成属性调用
- 自定义装饰器,根据功能创建自定义装饰器对其他函数进行修饰
Python内置装饰器详情,欢迎查看Python关于类内存分析一文也有讲述
好呐,我们来详细看看装饰器具体的用法,let’s go~
2. 内置装饰器
2.1 @classmethod
类方法是从属于类对象的方法。类方法通过装饰器@classmethod来定义
类方法中不能使用实例属性和s
@classmethod
def 类方法名(cls,[形参列表]):
函数体
复制代码
举个?,来看看作用
class Animal:
zone = "Asia" #类属性
def __init__(self,name):
self.name = name
@classmethod
def zoneinfo(cls):
print(cls.zone)
#类调用
Animal.zoneinfo()
#对象调用
cat = Animal("Tome")
cat.zoneinfo()
复制代码
2.2 @staticmethod
Python 中允许定义与类对象无关的方法,称为静态方法。
静态方法和在模块中定义普通函数没有区别
但是静态方法放到类的名字空间里面,需要通过“类调用”,需要创建对象,不会隐式传递self
静态方法通过装饰器@staticmethod来定义,格式如下:
@staticmethod
def 静态方法名([形参列表]):
函数体
复制代码
举个?,来看看作用
class Animal:
zone = "Asia" #类属性
def __init__(self,name):
self.name = name
@staticmethod
def food(food1,food2):
print("喜欢吃的食物为:{0},{1}".format(food1,food2))
#类调用
Animal.food("Apple","Orange")
#对象调用
cat = Animal("Tome")
cat.food("Apple","Orange")
复制代码
2.3 @propety
@property可以将一个方法的调用方式变成属性调用。通常代替gettar和settar方法,操作方便
@property
def 函数名():
函数体
复制代码
class Student:
def __init__(self,name,score):
self.name = name
self.__score = score
@property
def score(self): # Score方法当成属性来使用
print("Loading....")
return self.__score
@score.setter
def score(self,score):
if -1 < score < 101:
self.__score = score
else:
print("成绩错误")
stu = Student("Tome",85)
print("初始成绩:",stu.score)
#重新输入成绩
stu.score = 100
print("新成绩:",stu.score)
复制代码
3. 自定义装饰器
我们可以定义自定义函数作为装饰器,用@修饰其他的函数,来作为执行函数时“前置操作”。
- 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象
- 装饰器使用场景有:插入日志、性能测试、事务处理、缓存、权限校验等场景。
- 抽离出大量与函数功能本身无关的雷同代码并继续重用
装饰器的形式常见有四类如下:
- 不带参数装饰器
- 带参数装饰器
- 带不定参数装饰器
- 基于类实现的装饰器
我们本期先初步认识装饰器,后面我们再来深入的学习怎么创建自定义装饰器
我们来看一个栗子?,来看看实现一个简单的装饰器插入日志打印,体验一把自动定义装饰器
def Mylogging(func):
def wrapper(info):
print("function {func}()".format(func=func.__name__))
print("开始执行中..")
return func(info)
return wrapper
@Mylogging
def test(info):
print("{0}".format(info))
#调用被Mylogging装饰的test方法
test("JueJing")
复制代码
总结
我们今天学习了Python3个内置装饰器(@classmethod,@staticmethod,@property),根据需求我们也可以自定义装饰器去修饰其他的函数。
被装饰器修饰的函数,总是被替换成@符号所引用的函数的返回值,如果@符号所引用的函数返回值是函数,那么被修饰的函数在替换之后还是函数。
总之,装饰器概述地讲就是类似于我们使用测试用例之前的一些前置操作。
好啦,以上是本期内容,欢迎大家评论区评论,点赞关注,下次见~