python中的hook函数使用及应用场景

Python钩子函数 hook,又称钩子,在C/C++中一般叫做回调函数。钩子是从功能角度描述这种编程模式,回调则是从函数调用时间角度描述的。通常理解的hook是在一个已有的方法上加入一些钩子,使得在该方法执行前或执行后另在做一些额外的处理。如我们熟知的windows系统消息响应事件,鼠标点击对程序产生的影响是有程序自己决定的,但是程序的执行是受制于框架(windows系统),框架提供了一些通用的流程执行,但是往往框架或流程在设计时无法完全预料到以后的使用会有什么新需求,或者有些行为只有在运行时才能确定的。... 阅读详情


在这里插入图片描述

什么是hook?

经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么?

  • what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。
  • hook函数的作用 举个例子,hook的概念在windows桌面软件开发很常见,特别是各种事件触发的机制; 比如C++的MFC程序中,要监听鼠标左键按下的时间,MFC提供了一个onLeftKeyDown的钩子函数。很显然,MFC框架并没有为我们实现onLeftKeyDown具体的操作,只是为我们提供一个钩子,当我们需要处理的时候,只要去重写这个函数,把我们需要操作挂载在这个钩子里,如果我们不挂载,MFC事件触发机制中执行的就是空的操作。

从上面可知

  • hook函数是程序中预定义好的函数,这个函数处于原有程序流程当中(暴露一个钩子出来)
  • 我们需要再在有流程中钩子定义的函数块中实现某个具体的细节,需要把我们的实现,挂接或者注册(register)到钩子里,使得hook函数对目标可用
  • hook 是一种编程机制,和具体的语言没有直接的关系
  • 如果从设计模式上看,hook模式是模板方法的扩展
  • 钩子只有注册的时候,才会使用,所以原有程序的流程中,没有注册或挂载时,执行的是空(即没有执行任何操作)

本文用python来解释hook的实现方式,并展示在开源项目中hook的应用案例。hook函数和我们常听到另外一个名称:回调函数(callback function)功能是类似的,可以按照同种模式来理解。

hook应用场景(一)

相信你对钩子函数并不陌生。我在 requests 和 mitmproxy 都有看到类似的设计。

requests 使用hook

例如 requests 中需要打印状态码:

\# requests\_hooks.py
import requests
r = requests.get("https://httpbin.org/get")
print(f"status doce: {r.status\_code}")

打印状态码,这个动作,我们可以封装到一个函数里,然后作为钩子函数传给requests 使用。

\# requests\_hooks.py
import requests
def status\_code(response, \*args, \*\*kwargs):
    print(f"hook status doce: {response.status\_code}")
r = requests.get("https://httpbin.org/get", hooks={"response": status\_code})

代码说明:

把打印状态码封装到一个status_code() 函数中,在requests.get() 方法中通过hooks 参数接收钩子函数status_code()。

运行结果:

> python requests_hooks.py
hook status doce: 200

status_code() 作为一个函数,可以做的事情很多,比如,进一步判断状态码,打印响应的数据,甚至对相应的数据做加解密等处理。

mitmproxy 中的hook

mitmproxy是一个代理工具,我们这之前的文章也有做过介绍。在抓包的过程中,同样需要用到 hooks 去对request请求或response响应做一些额外的处理。

\# anatomy.py
"""
Basic skeleton of a mitmproxy addon.
Run as follows: mitmproxy -s anatomy.py
"""
import logging
class Counter:
    def \_\_init\_\_(self):
        self.num = 0
    def request(self, flow):
        self.num = self.num + 1
        logging.info("We've seen %d flows" % self.num)
addons = \[Counter()\]

运行mitmproxy

> mitmproxy -s anatomy.py

自己实现hook

什么情况下需要实现hook,就是一个功能(类/方法)自身无法满足所有需求,那么可以通过hook 就提供扩展自身能力的可能。

实现hook 并不难,看例子:

import time
class Programmer(object):
    """程序员"""
    def \_\_init\_\_(self, name, hook=None):
        self.name = name
        self.hooks\_func = hook
        self.now\_date = time.strftime("%Y-%m-%d")
    def get\_to\_eat(self):
        print(f"{self.name} - {self.now\_date}: eat.")
    def go\_to\_code(self):
        print(f"{self.name} - {self.now\_date}: code.")
    def go\_to\_sleep(self):
        print(f"{self.name} - {self.now\_date}: sleep.")
    def everyday(self):
        # 程序员日常三件事
        self.get\_to\_eat()
        self.go\_to\_code()
        self.go\_to\_sleep()
        # check the register\_hook(hooked or unhooked)
        # hooked
        if self.hooks\_func is not None:
            self.hooks\_func(self.name)
def play\_game(name):
    now\_date = time.strftime("%Y-%m-%d")
    print(f"{name} - {now\_date}: play game.")
def shopping(name):
    now\_date = time.strftime("%Y-%m-%d")
    print(f"{name} - {now\_date}: shopping.")
if \_\_name\_\_ == "\_\_main\_\_":
    # hook 作为参数传入
    tom = Programmer("Tom", hook=play\_game)
    jerry = Programmer("Jerry", hook=shopping)
    spike = Programmer("Spike")
    # 今日事情
    tom.everyday()
    jerry.everyday()
    spike.everyday()

代码说明:

在上面的例子中Programmer类实现三个功能:eat、code、sleep,但程序员也是普通人,不能每天都只吃饭、编码、睡觉,于是通过register_hook() 提供了做别的事情的能力。

那么,看看Tom、Jerry、Spike三位主角,今天都干了什么吧!

运行结果:

Tom - 2022-12-01: eat.
Tom - 2022-12-01: code.
Tom - 2022-12-01: sleep.
Tom - 2022-12-01: play game.
Jerry - 2022-12-01: eat.
Jerry - 2022-12-01: code.
Jerry - 2022-12-01: sleep.
Jerry - 2022-12-01: shopping.
Spike - 2022-12-01: eat.
Spike - 2022-12-01: code.
Spike - 2022-12-01: sleep.

hook应用场景(二)

如果把hook理解为:定义一个函数,然后作为参数塞到另一个类/方法里。 显然,这只是一种用法。我重新想了一下。httpRunner 的 debugtalk.py 文件; pytest 的 conftest.py 文件,他们本身也是拥有特殊名字的 hook文件。程序在执行的过程中,调用这些文件中的钩子函数完成一些特殊的任务。

以pytest为例子

└───project
    ├───conftest.py
    └───test\_sample.py
  • conftest.py
import pytest
@pytest.fixture()
def baidu\_url():
    """定义钩子函数"""
    return "https://www.baidu.com"
  • test_sample.py
import webbrowser
def test\_open\_url(baidu\_url):
    # 调用 baidu\_url 钩子函数
    # 调用 浏览器 访问 baidu\_url
    webbrowser.open\_new(baidu\_url)

两个文件看似没有直接的调用关系,在执行 test_sample.py 文件时,可以间接的调用 conftest.py 文件中的baidu_url()钩子函数。

执行测试

> pytest -q test_sample.py

实现动态调用hook

接下来,我们来试试做个类似的功能出来。

└───project
    ├───run\_conf.py
    ├───loader.py
    └───run.py
  • run_conf.py
def baidu\_url():
    """定义钩子函数"""
    name = "https://www.baidu.com"
    return name

与 conftest.py 文件类似,在这个文件中实现钩子函数。

  • loader.py
import os
import inspect
import importlib
def loader(name):
    """
    动态执行 hook 函数
    """
    # 被调用文件的目录
    stack\_t = inspect.stack()
    ins = inspect.getframeinfo(stack\_t\[1\]\[0\])
    file\_dir = os.path.dirname(os.path.abspath(ins.filename))
    # 被调用文件目录下面 \*\_conf.py 文件
    all\_hook\_files = list(filter(lambda x: x.endswith("\_conf.py"), os.listdir(file\_dir)))
    all\_hook\_module = list(map(lambda x: x.replace(".py", ""), all\_hook\_files))
    # 动态加载 \*\_config.py
    hooks = \[\]
    for module\_name in all\_hook\_module:
        hooks.append(importlib.import\_module(module\_name))
    # 根据传过来的 name 函数名,从 \*\_conf.py 文件查找并执行。
    for per\_hook in hooks:
        # 动态执行 process 函数
        func = getattr(per\_hook, name)
        return func()

这个东西就比较复杂了,他的作用就是丢给他一个的函数名, 他能通过*_conf.py文件中查找对应的函数名,并将函数执行结果返回。

loader() 函数是一个通用的东西,你可以把他放到任何位置使用。

  • run.py
import webbrowser
from loader import loader
def test\_open\_url():
    # 调用 baidu\_url 钩子函数
    # 调用 浏览器 访问 baidu\_url
    url = loader("baidu\_url")
    webbrowser.open\_new(url)
if \_\_name\_\_ == '\_\_main\_\_':
    test\_open\_url()

通过loader() 函数执行baidu_url 钩子函数,并拿到 url。

注意,我们不需要像传统的方式一样from run_conf import baidu_url 导入模块,只要知道钩子函数的名字即可。

这里的实现并没有 pytest 那么优雅,但也比较接近了。


关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,希望提供给那些想学习 Python 的小伙伴们一点帮助!

保存图片微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python基础学习视频

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
在这里插入图片描述

四、Python工具包+项目源码合集
①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

六、Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
这份完整版的Python全套学习资料已经上传优快云,朋友们如果需要可以保存图片微信扫描下方优快云官方认证二维码免费领取【保证100%免费】

Python的pytest框架(6)--测试钩子 (hooks) 详细拆解pytest框架的测试钩子hooks 阅读详情

相关推荐

Python中的钩子函数:深入了解Python中的钩子函数

通过使用钩子函数,我们可以方便地在程序的特定点插入自定义的代码,从而实现功能的扩展和定制化。钩子函数是一种常见的编程概念,它允许我们在程序执行的特定点上插入自定义的代码。钩子函数是一种回调函数,它允许我们在程序执行的特定点上注入自定义的代码。主程序可以定义一系列钩子函数,插件可以通过注册钩子函数来扩展主程序的功能。通过使用钩子函数,我们可以方便地在不修改原始函数的情况下,插入自定义的逻辑。函数时,实际上是调用了经过钩子函数包装后的新函数。的钩子函数,它接受一个函数作为参数,并返回一个新的函数。

YOLOv6666的博客 1310

Python中的钩子函数(hooks)介绍使用

python钩子函数的使用、注意事项

zpsimon的博客 5243

Hook 技术的全面解析:原理、实现与应用

首先,需要定义一个需要被 Hook 的原始函数。这个函数可以是一个简单的数学运算函数,也可以是一个复杂的业务逻辑函数。以下是一个简单的加法函数作为示例:python。

ylfhpy的博客 4186

Python钩子函数详解(注册函数、回调函数)

Hook钩子函数是一种回调(Callback)机制,允许程序在执行的特定点插入用户定义的代码。这种机制在事件处理、插件系统、调试工具等方面得到广泛应用。典型的Hook钩子包含预定义的事件点和用户自定义的处理函数hook函数,就是我们自己实现的函数,函数类型与挂载点匹配(返回值,参数列表)挂接,也就是hook或者叫注册(register),使得hook函数对目标可用目标挂载点,也就是挂我们hook函数的地方(我们想在这个目标点实现我们自己的功能)

Lance_mu的博客 1420

Android平台SO Hook技术实例解析与实践

Hook技术,即”钩子”技术,是一种在运行时拦截系统、库或应用程序行为的技术。在Android系统中,它被广泛应用于调试、性能监控、功能增强以及安全分析等领域。通过Hook技术,开发者可以窥视或修改代码执行流程,实现对系统底层的控制。这使得Android应用的开发和测试变得更加灵活和深入。Hook技术是一种特殊的编程技术,它能够在运行时拦截和修改系统或应用程序的执行流程。

weixin_36296444的博客 1375

Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决

介绍 主要解决如下问题 网络图标消失 常用方法配置中出现的网络图标变成灰色没有办法打开 打开网络和Internet闪退 错误提示`网络发现已关闭。网络计算机和设备不可见。请启动网络和共享中心的网络发现。 连不上网,诊断结果为 依赖服务或组无法启动 这个问题大概率通过重装系统不能解决,请大家谨慎测试之后最后选择重装这个路线。 方法1:这一步一定要做(卸载三方软件) 把360安全卫士,软件管家这些东西都卸载掉。 我的问题一开始就是这个软件引起的,可能他检测到我还给台式机配了无线网卡,然后就把有线网络的一些

呆呆象呆呆的博客 3万+

python api框架 hook_5 分钟读懂Python 中的 Hook 钩子函数

1. 什么是Hook经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?hook的作用是什么?what is hook ?钩子hook,顾名思义,可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。hook...

weixin_39686353的博客 857

常见卫星图源下载教程

上面列出的8个常见的亚米级别数据源都可以通过xyz协议或者wmts/wms协议进行下载。这些协议是什么?地理信息数据为了方便网络传输,制定了一系列的地理数据传输标准(wms/wmts/xyz等)。协议特点优点缺点栅格数据支持矢量数据支持WMS通过HTTP请求获取GIS数据,服务器会将数据渲染成图像高度定制的地图;交互性强服务器渲染图像,响应时间较长支持有限支持WMTS提供预渲染的地图瓦片速度快,因为地图瓦片可以预先生成并在请求时快速提供瓦片的内容是预先确定的,无法进行定制支持。

锐多宝的地理空间 1万+

python打卡 DAY 42 Grad-CAM与Hook函数

靠近分类层的3x3卷积效果最佳。:扩展支持batch维度计算。:结合不同深度的特征图。

2301_76970300的博客 1150

WOFOST作物模型(1):PCSE环境配置

get_summary_output() 方法通常用于在 PCSE 模拟过程结束后,获取模拟结果的摘要信息,例如模拟期间的总产量、总水分需求等。它可以提供对模拟结果的快速总结,方便用户进行后续的分析和处理。用.get_output来获取过程参数,并将这些参数转为dataframe显示。用run_till_terminate()代表终止。安装好之后,打开jupyter notebook。也可以指定运行时间,并获取最后一天的参数。首先还是打开之前建好的gee虚拟环境。

所有专家都曾始于新手 681

Android11车机系统海外项目资源包RRO方案优化

本文介绍了汽车设置应用如何通过Android RRO(运行时资源叠加)方案实现多车型差异化资源管理。针对不同车型(国内/海外、轿车/SUV)和配置(方向盘、轮毂等),采用产品变体(productFlavors)构建不同APK版本,并通过JSON配置文件动态启用对应资源包。系统根据车辆下线配置自动匹配适用的资源叠加包,解决了硬编码判断带来的维护问题。该方案实现了资源的高效复用,同时支持灵活配置多种车型组合,为汽车行业多车型共平台开发提供了可扩展的技术实现。

shusuanly的博客 469

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

freeking101的博客 2万+

uniapp:在map地图组件上添加控件,在地图上添加浮层展示自定义按钮或元素,uniApp如何在Map组件地图上添加悬浮在上面的图标/图片(全平台兼容安卓苹果app、H5网页、微信小程序、nvue)

uni-app的map添加控件问题,uniapp实现地图展示控件,uniapp小程序如何在map组件上增加按钮,uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,Uniapp腾讯地图添加控件,uniapp百度地图添加控件,地图上展示控件并可以点击,在地图上展示控件信息,uniapp map地图怎么向地图上增加工具栏,使用cover-view将控件在地图上展示,解决uniapp map上添加浮层无法显示问题,不显示怎么办,css样式不生效,地图等最高层

✅ 精选推荐文章 3230

Python 训练营打卡 Day 42

然而,标准的前向传播和反向传播过程通常是一个黑盒,我们很难直接访问中间层的信息。PyTorch 提供了一种强大的工具——hook 函数,它允许我们在不修改模型结构的情况下,获取或修改中间层的信息。这种形式很简约,只需要一行就可以定义一个函数,lambda 的核心价值在于用极简语法快速定义临时函数,避免为一次性使用的简单逻辑单独命名函数,从而减少代码冗余,提升开发效率。Hook 函数是一种回调函数,它可以在不干扰模型正常计算流程的情况下,插入到模型的特定位置,以便获取或修改中间层的输出或梯度。

2401_86382089的博客 909

mediasoup源码分析(二十)服务端架构设计

目录 简介 信令服务(房间服务) 调度服务 媒体服务 简介 流媒体服务器大的方向上可以分为上述三个模块。目前行业内都是分布式服务,独立部署。mediasoup信令与媒体之间虽然可以管道通信。但在行业内,服务之间通过管道通信用的少。 一般是rpc、mq,或者传统的tcp。这块licode架构比较不错,licode是信令和媒体服务通过MQ消息队列解耦。 下面介绍一下这三个服务主要功能,当然文中所说也是一家之言。 信令服务(房间服务) 信令服务也称为房间服务。有的企业把信令和房间分开,信..

lcalqf的专栏 1545

Spring Framework 7.002.Spring IoC 容器与 Bean 简介(Introduction to the Spring IoC Container and Beans)

摘要:Spring框架的核心技术包括IoC容器和AOP技术。IoC容器通过依赖注入实现控制反转,提供Bean管理和配置功能。ApplicationContext作为BeanFactory的扩展,增加了企业级特性。文档详细介绍了容器配置、Bean定义、依赖注入、作用域等核心概念,以及基于注解的配置方式。AOP框架支持80%的AOP需求,并可集成AspectJ。此外还涵盖环境抽象、容器扩展点等高级特性,为Java企业应用开发提供全面支持。(150字)

无 212

Java/PHP/Python 运行时 Hook 技术与反 Hook 对抗实战(上)

也称为。

Alfadi联盟 萧瑶的博客 881

【推荐100个unity插件】基于节点的程序化无限地图生成器 —— MapMagic 2

MapMagic 2是一款基于节点的程序化地形生成工具,可快速创建无限地图。主要功能包括:通过图形化节点编辑器构建地形逻辑;支持四个核心模块(对象、样条线、生物群落和笔刷);提供完整的操作指南,包括创建资产、使用编辑器窗口、节点操作等。工具具有直观的UI界面,支持节点连接、参数调整、图层管理等功能,并能实时生成地形。适合游戏开发者快速构建高质量的可玩地形环境。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3121

2021-05-10

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表 a = [1,2,3] b = [4,5,6] c = [4,5,6,7,8] zipped = zip(a,b) # 打包为元组的列表 输出 [(1, 4), (2, 5), (3, 6)] zip(a,c) # 元素个数与最短的列表一致 [(1, 4),

Q7777727的博客 318

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

5 分钟掌握 Python 中的 Hook 钩子函数

1. 什么是Hook经常会听到钩子函数(hook function)这个概念,最近在看目标检测开源框架mmdetection,里面也出现大量Hook的编程方式,那到底什么是hook?ho...

Python中文社区 6405

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

python强大的hook函数

钩子函数(hook function),可以理解是一个挂钩,作用是有需要的时候挂一个东西上去。具体的解释是:钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。

nhb687095的博客 2124

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Python Hook钩子函数详解

Hook钩子函数是一种回调(Callback)机制,允许程序在执行的特定点插入用户定义的代码。这种机制在事件处理、插件系统、调试工具等方面得到广泛应用。典型的Hook钩子包含预定义的事件点和用户自定义的处理函数。Python中的Hook钩子函数为开发者提供了一种灵活、可扩展的编程机制。本文深入探讨了Hook的基本概念、基本用法,以及在事件触发、插件系统等常见场景的应用。通过实例展示了动态注册、上下文管理器、AOP等高级用法,更全面地理解了Hook的多样化应用。

涛哥聊Python 5252

hook函数

在计算机编程中,hook函数是指在特定的事件发生时被调用的函数,用于在事件发生前或后进行一些特定的操作。通常,hook函数作为回调函数被注册到事件处理器中,当事件发生时,事件处理器会自动调用相应的hook函数。hook函数通常用于实现程序的扩展性和可定制性,允许用户在程序运行时添加自定义的操作或修改程序的行为。在很多框架和库中,hook函数被广泛应用于实现特定的功能和操作,例如在深度学习框架中,hook函数可以用于记录指标、可视化网络结构、保存模型和优化器状态等。一些常见的hookpre-hook。

qq_44089890的博客 4730
上一篇: 学习的秘诀:python控制结构的条件判断与循环示例详解
下一篇: Python-Plotly实现数据可视化的五种动图形式
一秋的编程笔记
博客等级 码龄4年 1588粉丝 319原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值