首页 > 编程语言 >python闭包_装饰器

python闭包_装饰器

时间:2023-07-08 16:23:26浏览次数:33  
标签:闭包 python test rate call func print 装饰 def

6.python高级知识-闭包装饰器/demo02_闭包.py

# -*- coding:utf-8 -*-

# 第一种方法================================
# 每次都更具汇率和钱都写一遍
# 这种方法是太烦了
print("第一种方法")
rate_usa = 0.7
money = 100
# print(rate_usa * money)
print("第一种方法结束")

# 第二种方法封装成函数================================
# 这种方法还是太烦
print("第二种方法")


def count_rate(rate, money):
    print(rate * money)


count_rate(100, 1000)
print("第二种方法结束")


# 第三种方法用缺省参数来代替汇率的输入================================
# 这种方法还是太烦
print("第三种方法")


def count_rate(money, rate=0.7):
    print(money * rate)


count_rate(100)
count_rate(100, 1000)
print("第三种方法结束")

# 第四种方法用全局变量来代替汇率的输入================================
# 这种方法还是太烦
print("第四种方法")
rate = 100


def count_rate(money):
    print(money * rate)


count_rate(100)
print("第四种方法结束")

# 第五种方法分装成类================================
# 这种方法魔法方法 太多还是太烦
print("第五种方法")


class CountRate(object):
    def __init__(self, rate):
        self.rate = rate

    def __call__(self, money):
        print(self.rate * money)


usa = CountRate(0.7)
usa(200)
rate_jp = CountRate(1000)
rate_jp(1000)

print("第五种方法结束")


# 第六种方法:闭包解决================================================
print("第六种方法")


def count(rate):
    def money(money):
        print(rate * money)

    return money


usa_rate = count(0.7)
usa_rate(100)

print("第六种方法结束")

6.python高级知识-闭包装饰器/demo06_装饰器_传递任意参数.py

# -*- coding:utf-8 -*-
def set_func(func):
    def call_fun(*args, **kwargs):
        return func(*args, **kwargs)

    return call_fun


@set_func
def test(data):
    return "test is show%s" % data


print(test(100))

6.python高级知识-闭包装饰器/demo03_闭包_函数引用.py

# 先写一个闭包
def set_fun(func):
    def call_fun():
        print('权限')
        func()

    return call_fun


def test():
    print("test is show")



# 把test函数引用传入闭包获取到内层函数的引用,将a指向内层函数的引用
a = set_fun(test)
# 调用内层函数
a()


6.python高级知识-闭包装饰器/demo08_类装饰器.py

# -*- coding:utf-8 -*-
class Func(object):
    def __init__(self, func):
        print('execute init function')
        self.func = func          # 类装饰器,会执行该类的init函数,然后传入的函数存储起来          

    def __call__(self, *args, **kwargs):
        print('execute call function')
        return self.func(*args, **kwargs)          # 然后会执行改类的call函数,在call函数里面直接调用传入的函数即可


@Func
def test(data):
    return "test is show%s" % data


print(test(100))

6.python高级知识-闭包装饰器/demo05_装饰器_传递参数.py

# -*- coding:utf-8 -*-
def set_func(func):
    def call_fun(data):
        func(data)

    return call_fun


@set_func
def test(data):
    print("test is show%s" % str(data))


test(100)

6.python高级知识-闭包装饰器/demo04_闭包_函数引用_语法糖_装饰器.py

# -*- coding:utf-8 -*-
# 先写一个闭包


def set_fun(func):
    def call_fun():
        print('权限')
        func()
    return call_fun


@set_fun  # 这个是语法糖:相当于test = set_fun(test)
def test():
    print("test is show")


# 调用内层函数
test()

6.python高级知识-闭包装饰器/demo01_函数_引用函数_函数当做参数.py

# -*- coding:utf-8 -*-
def test(data):
    print("test is show")


# 调用函数
test(123)


# 引用函数
ret = test

print(ret)
print(test)
print(ret==test)


# 通过引用调用函数
ret(123)


# 把函数引用当成参数传递
def application(func):
    func(123)


application(ret)

6.python高级知识-闭包装饰器/demo07_多个装饰器的执行顺序.py

# -*- coding:utf-8 -*-


def set_func1(func):
    print("set_fun1执行了")

    def call_fun(*args, **kwargs):
        print("call_fun1执行了")
        return func(*args, **kwargs)

    return call_fun


def set_func2(func):
    print("set_fun2执行了")

    def call_fun(*args, **kwargs):
        print("call_fun2执行了")
        return func(*args, **kwargs)

    return call_fun


@set_func2
@set_func1
def test():
    return "test is show"


print(test())

标签:闭包,python,test,rate,call,func,print,装饰,def
From: https://www.cnblogs.com/zhuoss/p/17537409.html

相关文章

  • python创建类似于wx.EVT_BUTTON这样的自定义事件
    想要创建类似于wx.EVT_BUTTON这样的自定义事件,可以通过定义一个继承自wx.PyEvent的子类,并在其中添加自定义的事件类型。下面是一个示例代码:importwx#创建自定义事件类型MY_EVENT_TYPE=wx.NewEventType()EVT_MY_EVENT=wx.PyEventBinder(MY_EVENT_TYPE,1)#创建自定义......
  • Python socket编程(转载)
    Pythonsocket编程https://www.cnblogs.com/linhaifeng/articles/6129246.html套接字工作流程服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,......
  • 从零用python flask框架写一个简易的网站
    要用Python写一个网站,你可以使用Python的Web框架来开发。常见的PythonWeb框架包括Django、Flask、Bottle等。以下是一个简单的使用Flask框架开发的示例。1.安装Flask在开始开发之前,你需要安装Flask框架。你可以使用以下命令来安装:pipinstallflask2.创建Flask应用在安装......
  • python: create animated GIF
    #-*-coding:UTF-8-*-#encoding:utf-8#-*-coding:UTF-8-*-#版权所有2023©涂聚文有限公司#许可信息查看:#描述:#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python11#Datetime:2023/7/511:08#User:geovindu#Prod......
  • python中偏导数Partial使用方法
    partial()偏函数partial是Pythonfunctools模块中的一个高级函数。它对普通函数进行封装,主要功能是把一个函数的部分参数给固定住,返回一个新的函数。通俗点说,就是冻结原函数的某些参数。该函数形式如下:functools.partial(func[,*args][,**kwargs])其中func是定义的函数。......
  • 高级编程技巧揭秘!精通Python装饰器,打造灵活强大的代码结构!
    装饰器是Python中一种强大而灵活的编程技巧,它可以用于修改或扩展函数的行为,同时又不需要修改函数的源代码。本文将介绍Python中的装饰器的基本概念、使用方法以及高级技巧,帮助你从入门到精通装饰器的使用。一、基本概念在深入学习装饰器之前,我们首先需要了解一些基本概念。1.1......
  • Python内置函数zip()的用法
    zip()函数介绍:zip()函数是Python的内置函数,将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的list(Python3为了节约内存,zip()返回的是zip对象,需要通过list()手动转换成列表)如果zip()没有可迭代的元素,则它将返回一个空的迭代器,如果每个迭代器......
  • python 下载element源码
    #encoding:utf-8frombs4importBeautifulSoupimportrequests,re,os,socketfromurllibimportrequest#指定要下载的版本element_ui_version="2.15.13"#指定文件要存放的位置element_ui_dir="D:/tmp"save_ui_dir=os.path.join(element_ui_dir,"elem......
  • 如何实现MAC Python加入环境变量的具体操作步骤
    如何在Mac上将Python加入环境变量作为一名经验丰富的开发者,我将帮助你学习如何在Mac上将Python加入环境变量。这将使你能够在终端中直接运行Python命令,而无需指定完整的Python安装路径。整体流程下面是添加Python到环境变量的步骤:步骤内容步骤一打开终......
  • Python | 获取文件中的行数
    在Python中,获取文件中的行数可以帮助我们更好地处理和分析数据。Python提供了一种简单的方法来获取文件中的行数,下面将介绍两种常用的方法。方法一:使用循环和计数器我们可以使用一个循环来读取文件中的每一行,然后使用计数器来计算行数。下面是示例代码:#打开文件withopen(......