Python核心编程的——装饰器

杰米粉2021-12-28 11:42

  代码的编写需要遵循封闭开放的原则。封闭意味着现有的功能代码不允许随意修改,开放意味着现有的功能可以扩展。例如,一款手机游戏现在可以实现现有的游戏模式,但随着外部环境(市场竞争、用户体验等)的变化和发展,现有的游戏模式已经不能满足用户的需求。为了留住用户,我们需要添加更多的游戏方法来保持用户对游戏的新鲜感,因此开发人员在原游戏的基础上开发了几种游戏模式。这样,新的游戏版本不仅增加了第一个游戏模式,而且保留了原来的游戏模式,反映了封闭开放的原则。装饰器的功能是在不改变原始代码的情况下扩展原始功能,以确保开发的效率和代码的稳定性。打印输出99乘法表可通过以下代码实现:

def func_1():
"""打印输出九九乘法表"""
for i in range(1,10):
  for j in range(1,i + 1):
    result = i * j
    print('{}*{}={}'.format(i,j,result),end=' ')
  print('')
if __name__ == '__main__':
func_1()

  输出结果如下:如果现在需要实现一个功能,在不修改func_1函数代码的情况下,在99乘法表之前添加一个表头描述,并在乘法表最后添加一个描述。以下代码实现了装饰器的功能:

def shuoming(func):
def shuoming_in():
  print('以下为九九乘法表:')
  func()
  print('以上为九九乘法表')
return shuoming_in

def func_1():
"""打印输出九九乘法表"""
for i in range(1,10):
  for j in range(1,i + 1):
    result = i * j
    print('{}*{}={}'.format(i,j,result),end=' ')
  print('')

if __name__ == '__main__':
func_1 = shuoming(func_1)
func_1()

  输出结果如下:可见func_1函数的代码没有修改,问题提出的要求已经实现,核心在于最后两行代码。通过下图了解装饰器的执行过程:

Python核心编程的——装饰器

  图解:和以前一样,Python解释器自上而下解释代码,遇到定义函数的代码时不用管,因为没有调用函数就不会执行;这样直接来到第22行代码,程序首先执行赋值号=右边的代码,shuoming(func_1)调用之前定义的函数,并传入func_1实参,程序转移到shuoming(func)执行,形参func接收实参func_1.此时func也指向func_1所指向的函数(如图中分界线上方白色方框中的蓝色箭头所示);在shuoming()函数中,代码继续向下移动,在shuoming()函数内容中定义另一个shuoming_ing(如图中分界线上方白色方框中的蓝色方框所示)函数(如图所示),然后向下移动g_ing函数的引用返回。最后,调用func_1所指向的函数,即shuoming_in()函数,shuoming_in()函数中的func指向原func_1()所指的函数(即生成九九乘法表的函数),因此程序的最终结果是在九九乘法表前后添加一个解释性字符串。

  以上是装饰器的执行过程,但以上装饰写法不够简洁。大多数情况下,采用以下写法,输出结果相同:

def shuoming(func):
 def shuoming_in():
   print('以下为九九乘法表:')
   func()
   print('以上为九九乘法表')
 return shuoming_in

"""@shuoming相当于func_1 = shuoming(fucn_1)"""
@shuoming
def func_1():
 """打印输出九九乘法表"""
 for i in range(1,10):
   for j in range(1,i + 1):
     result = i * j
     print('{}*{}={}'.format(i,j,result),end=' ')
   print('')
if __name__ == '__main__':
 """直接调用func_1即可完成装饰"""
 func_1()

  有时装饰函数可能有以下几种情况:存在或不存在参数、返回值或不返回值、参数可能是固定长度或不固定长度等。为了通用性,与爬虫的请求代码相同,装饰器有一的写作方法:

def tongyong(func):
def tongyong_in(*args,**kwargs):
  ret = func(*args,**kwargs)
  return ret
return tongyong_in

  如果需要特定的装饰效果,可以修改这个通用代码。

  以上就是小编为大家整理发布的“Python核心编程的——装饰器”一文,更多相关内容尽在开课吧广场Python教程频道。

免责声明:本站所提供的内容均来源于网友提供或网络搜集,由本站编辑整理,仅供个人研究、交流学习使用。如涉及版权问题,请联系本站管理员予以更改或删除。
有用
分享