千纸鹤

  博客园  ::  :: 新随笔  ::  ::  :: 管理
  5 随笔 :: 70 文章 :: 0 评论 :: 9301 阅读

1、装饰器定义

是给已有的函数增加额外的功能  本质是一个闭包函数

2、闭包形成条件

a.实现函数嵌套
b.内部函数使用外部函数的变量
c.外部函数返回内部函数的名字

3、简单的闭包

# 外部函数
def test1():
  b=10
  # 内部函数
  def test2():
    print(b)
  return test2

a=test1()
a()
输出结果:10

函数执行流程:
a.从上往下的流程运行,走到调用函数的时候才运行;
b.当调用test1()时,开始运行test1()函数;
c.运行test1函数期间:无法运行test2()函数,原因是test2()函数未被调用,最后返回test2,给到test1();
d.test1接受到test2,赋值到a变量,a()函数就是等同于test2()函数,执行test2(),打印值。

4、拿到函数的变量,在另外一个函数计算

  def test1(num1):
    def test2(num2):
      result=num1+num2
      print(result)
    return test2
  a=test1(2)
  a(3)
  输出结果:5

5、给已有的函数增加额外的功能:发表的功能,先登录,检查登录,只有等登录完成之后才能去发表评论

def check(fc):
  print('检查登录')
  def inner():
    print('登录')
    fc()
  return inner
# 发表评论
def comment():
  print('发表评论') 

c=check(comment)
c()

输出结果:
检查登录
登录
发表评论

函数执行流程:
a.从上往下的流程运行,走到调用函数的时候才运行;
b.当调用check(comment)时,开始运行check(fc)函数,输出:"检查登录";
c.运行check(fc)函数期间:无法运行inner()函数,原因是inner()函数未被调用,最后返回inner,给到check(fc);
d.check(fc)接受到inner,赋值到c变量,c()函数就是等同于inner()函数,执行inner(),输出:"登录";
e.由于调用check(comment)就是运行check(fc),fc()就是相当于comment(),执行comment(),输出:"发表评论"

6、装饰器的语法糖写法

def check(fc):
  print('检查登录')
  def inner():
    print('登录')
    fc()
  return inner
# @check 相当于 check(comment)
@check
def comment():
  print('发表评论')

comment()

输出结果:
检查登录
登录
发表评论

函数执行流程:
从上往下的流程运行,走到调用函数的时候才运行;
当调用@check时,(@check相当于check(comment)),开始运行check(fc)函数,输出:"检查登录";
运行check(fc)函数期间:无法运行inner()函数,原因是inner()函数未被调用,最后返回inner,给到check(fc);
check(fc)接受到inner,赋值到comment()函数,comment()函数就是等同于inner()函数,执行inner(),输出:"登录";
由于调用check(comment)就是运行check(fc),fc()就是相当于comment(),执行comment(),输出:"发表评论"

7、练习题目(用装饰器实现):现在有个函数,想要知道这个函数执行了多久

import time
def decorate(fc):
  def inner(a,b,c):
    # 获得了当前的时间
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    t_start=time.time()
    a=fc(a,b,c)
    print(a)
    # 获得了当前的时间
    t_end=time.time()
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    print('总共花了多久的时间%.2f'%(t_end-t_start))
    # inner函数没有return 没有return 就是NOne
    return 2
  return inner
# 小弟相当于 decorate(test_un)
@decorate
def test_un(a,b,c):
  time.sleep(1)
  print('test_un在执行中')
  return a+b+c

# test_un()相当于 inner
print(test_un(1,2,3))

输出结果:
2022-04-23 21:31:28
test_un在执行中
a+b+c= 6
2022-04-23 21:31:29
总共花了多久的时间1.00
2

8、实例方法、静态方法和类方法:可以通过对象去调用的

class Foo(object):
  def instance_method(self):
    print('实例方法') 

  @staticmethod
  def static_method():
    print('静态方法')

  @classmethod
  def class_method(cls):
  print('类方法')
foo=Foo()
foo.instance_method()
foo.static_method()
foo.class_method()

输出结果:
实例方法
静态方法
类方法

9、静态方法和类方法:通过类去调用;实例方法只能创建对象,在通过类去调用

class Foo(object):
  def instance_method(self):
    print('实例方法')

  @staticmethod
  def static_method():
    print('静态方法') 

  @classmethod
  def class_method(cls):
    print('类方法')
Foo.instance_method('aa')
Foo.static_method()
Foo.class_method()

输出结果:
实例方法
静态方法
类方法

10、静态方法的应用

import time
class TimeTest(object):
  def __init__(self,hour,minute,second):
    self.hour=hour
    self.minute=minute
    self.second=second 

  @staticmethod
  def showTime():
    return time.strftime('%H:%M:%S',time.localtime()) 

print(TimeTest.showTime())
输出结果:22:11:04

11、类方法的应用

class Tool:
  count=0
  def __init__(self,name):
    self.name=name
    Tool.count+=1

  @classmethod
  def show_tool_count(cls):
    print('工具对象的总数:%d'%cls.count)

tool1=Tool('锄头')
tool2=Tool('斧头')
tool3=Tool('棒槌')
Tool.show_tool_count()
输出结果:工具对象的总数:3

posted on   隆江猪脚饭  阅读(38)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示