1.5 Python高级编程-上下文管理器

在 Python 中使用上下文管理器context manager的 5 个层次 由于每台机器的计算资源都是有限的,因此每个程序都需要考虑资源管理。比如文件处理,最好在使用完文件后将其关闭。files = []因此,只要不再需要,就应关闭每个已打开的文件。Python 有相对的内置函数built-in functions,因此我们可以方便地打开和关闭文件。")f.close()上述程序是可行的。但是,如果open()和close()之间的处理过程变得更加复杂,并且出现错误,那么没有人能够保证文件最终会被关闭。 阅读详情

在Python编程中,上下文管理器是一种用于自动化资源管理的高级工具。它们通常用于处理临时性或需要清理的资源,如文件、网络连接、数据库连接等。本文将详细介绍Python上下文管理器的基本概念和如何使用它们。

  1. 上下文管理器的基本概念

上下文管理器是一种处理资源的生命周期的设计模式。它们通常由两个方法组成:__enter__()和__exit__()。__enter__()方法在上下文管理器被调用时返回资源,__exit__()方法在上下文管理器退出时被调用,用于清理资源。

以下是一个简单的上下文管理器示例:

class MyContextManager:
    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        print("Context manager exiting")
  1. 使用上下文管理器

在使用上下文管理器时,我们需要将其作为一个函数调用,然后将返回的对象传递给with语句。with语句会自动处理__enter__()和__exit__()方法的调用。

以下是一个使用上下文管理器处理文件的示例:

class MyFileContextManager:
    def __init__(self, file):
        self.file = file

    def __enter__(self):
        self.file.open()
        return self

    def __exit__(self, type, value, traceback):
        self.file.close()

with MyFileContextManager("myfile.txt") as file:
    file.write("Hello, world!")

在这个例子中,MyFileContextManager是一个上下文管理器,它管理一个文件。__enter__()方法在上下文管理器被调用时打开文件,__exit__()方法在上下文管理器退出时代理关闭文件。当我们使用with语句时,文件会在上下文管理器退出时被自动关闭。

总结

Python上下文管理器是一种强大的工具,可以帮助我们自动化资源管理。通过实现__enter__()和__exit__()方法,我们可以创建自己的上下文管理器来处理各种资源。在实际项目中,我们可以使用上下文管理器来处理文件、网络连接、数据库连接等资源,使代码更加整洁和高效。

【Python】深入理解Python中的上下文管理器:揭秘with语句的高级用法 Python的上下文管理器是一种强大的工具,能够有效简化资源管理流程,提升代码的可读性和维护性。通过`with`语句,开发者可以更轻松地管理文件、数据库连接、线程锁以及其他需要显式关闭或释放的资源。然而,很多人对上下文管理器的理解仅限于基础的文件操作,而忽视了它在更复杂场景中的潜力。本篇文章深入探讨Python上下文管理器的高级用法,包括自定义上下文管理器、使用`contextlib`模块创建更灵活的资源管理结构,以及上下文管理器在多线程和异步编程中的应用。文章还将详细剖析如何在函数式编程中利用上下文管理器 阅读详情

相关推荐

一文掌握python上下文管理器(with语句)

理解Python上下文管理器主要涉及到几个核心概念:上下文管理协议、with语句以及如何自定义上下文管理器。

qq_38120851的博客 1234

Python中的上下文管理器:使用with管理成对操作,初级及高级用法解析

Python 的上下文管理器为我们提供了一种优雅、简洁且强大的方式来管理资源的获取和释放。通过实现 __enter__ 和 __exit__ 方法,或者使用 contextlib 模块的工具,我们可以在代码块的前后自动执行特定的逻辑,确保资源被正确地管理,避免资源泄漏和异常未处理等问题。

橙色小博的博客,励志在人工智能领域发光发热! 5049

Python进阶之-上下文管理器

本文介绍了Python中的上下文管理器,包括其基本概念、组成、标准库中的应用、自定义上下文管理器的实现以及contextlib模块的使用。重点强调了上下文管理器在资源管理、异常处理和代码整洁性方面的优势。

u011352768的博客 903

探索Python中的上下文管理器

上下文管理器是遵循特定协议的对象,这个协议包括和__exit__()两个魔术方法。方法在with语句的代码块执行前被调用,而__exit__()方法则在代码块执行完毕后被调用,无论代码块是否正常结束或者因为异常而终止。自定义上下文管理器是Python中一项强大的功能,它允许开发者封装资源的获取和释放逻辑,确保资源使用完毕后能够正确地进行清理。在这一节中,我们将探讨如何创建自定义上下文管理器,并提供多个示例来展示其应用。自定义上下文管理器非常有用,特别是在处理那些Python标准库没有提供内置支持的资源时。

无远弗届 1005

如何在Python中编写自定义上下文管理器?

现在,让我们最后看看如何编写您自己的自定义管理器,以便对资源管理进行细粒度的控制。编写自定义上下文管理器有两种主要方法:基于类的和基于函数的。基于类的方法基于类的方法是编写上下文管理器的最结构化和最灵活的方法。在这里,您定义了一个实现特殊方法__enter__和__exit__的类。Timer类定义了__enter__方法,以在您进入with块时捕获开始时间。它返回self以允许访问块内的对象。__exit__方法计算退出with块时所用的时间并打印出来。基于函数的方法。

python收藏家的博客 1141

Python基础技能之python中的上下文管理器和with语句的使用

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本篇文章主要介绍了Python中的上下文管理器和with语句的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧 文章目录为什么需要上下文管理器?举两个例子:上下文管理器怎么使用?上下文管理实现机制上下文管理器实现 python2.5之后引入了上下文管理器(context manager),算是Python的黑魔法之一,它用于规定某个对象的使用范围。本文是针对于该功能的思考总结。 为什么需要上下文管理器? 首

python爬虫程序学习教程 2407

Python 高级编程学习

掌握这些高级特性可以让你编写出更高效、更简洁、更健壮、更具 Pythonic 风格的代码。建议在实际项目中多加练习和应用,深入理解其原理和适用场景。好的,这是一份 Python 高级编程的简洁教程,旨在用精炼的内容覆盖广泛的高级用法。

zhangyunchou2015的博客 1409

Python上下文管理器进阶:利用contextlib编写高效简洁的代码

上下文管理器是Python中管理资源的重要工具,常用于文件操作、网络连接和数据库事务等场景。Python的`contextlib`库提供了一系列工具,帮助开发者更灵活高效地编写上下文管理器。本文将深入介绍`contextlib`库中的`@contextmanager`装饰器,以及`contextlib`中的其他工具,讲解如何利用这些工具构建更简洁的代码。通过详细的代码示例和中文注释,本文展示了上下文管理器在不同场景下的应用,为读者理解和应用Python上下文管理器提供了全面的指导。

一个被知识诅咒的人 1312

Python高级编程技术深度解析与实战指南

本文深入解析Python高级编程核心技术,包含三大核心模块:1. 高级特性详解:剖析装饰器元编程原理、生成器的内存优化机制(内存占用减少99%)及上下文管理器的资源自动管理;2. 面向对象进阶:通过矩阵运算实例演示魔术方法重载,采用抽象基类设计图形计算接口规范;3. 并发编程对比:量化分析多线程与多进程在I/O密集(吞吐量提升3倍)和CPU密集场景(性能提升8倍)的差异,图解异步事件循环调度机制。全文通过20+代码示例、5类性能对比数据和3种UML图示,系统展示Python高级编程的最佳实践方案。

软件科学-郝学胜 6012

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 899

芯片设计中的setup和hold检查:为什么你的电路会跑飞?

本文深入解析了芯片设计中Setup与Hold检查的核心原理,它们是确保电路可靠运行的“黄金窗口”。通过剖析触发器物理本质、时序路径公式及检查方法,解释了Setup违例(数据太慢)和Hold违例(数据太快)如何导致电路“跑飞”,并提供了从RTL优化到物理实现的实战修复策略与协同优化技巧。

weixin_29268267的博客 476

解密Python高级特性:深度探讨装饰器与上下文管理器的魔法

在Python编程的奇妙世界里,有两个被誉为编程魔法的特性:装饰器和上下文管理器。它们不仅如同纹章和护盾般赋予代码强大的能力,更是提升代码优雅性和可维护性的法宝。本篇文章将深入研究这两项高级特性,揭示它们的神秘面纱,同时通过丰富的实例展示它们的多样应用。

theskylife的博客 1263

shopro 商城,2025年新申请的微信支付提示失败,支付提示 Get Wechat Public Cert Error 问题的修复办法

shopro 商城,最近新申请的微信支付商户 支付提示 Get Wechat Public Cert Error 问题的修复办法

行走的卡路里 1245

Python上下文管理器(with语句)的魔力与自定义

本文介绍了Python中的上下文管理器及其with语句的使用。上下文管理器通过__enter__和__exit__方法实现资源的自动管理,确保资源在使用后正确释放。文章详细解析了with语句的工作原理,并展示了文件操作、线程锁管理和数据库连接等常见应用场景。通过自定义上下文管理器,开发者可以编写更优雅、健壮的代码,有效避免资源泄漏问题。上下文管理器是Python编程中实现资源安全管理的强大工具。

闲人编程的博客 950

从AT指令到万物互联:移远EG800K-CN模块的协议栈深度解析与实践指南

本文深度解析移远EG800K-CN 4G模块的协议栈架构与AT指令体系,涵盖MQTT云端集成、多协议配置优化及工业级故障排除指南。通过实战示例展示如何利用该模块构建稳定可靠的物联网连接方案,实现从设备到云端的万物互联。

jupyter5notebook的博客 362

UE5.6使用ndisplay,单窗口多画面(单机部署),配置、打包流程,无需switchboard

摘要:本文介绍了在UE5.6中使用ndisplay插件的完整流程。首先需要开启ndisplay和launch插件,创建ndisplay配置文件并设置本地单窗口多画面模式。随后通过Process Explorer获取启动命令用于制作bat文件。打包项目时需删除场景中的ndisplay文件,但保留内容浏览器中的配置,并设置为开发版打包。最后将ndisplay文件导出为.ndisplay格式,与bat文件一起放置在打包目录下,通过bat启动程序。注意修改路径和窗口大小时需保持纯英文路径,且bat代码需保持单行格式

weixin_43912248的博客 977

【python进阶-10】with上下文管理器

语句,能够确保在使用完资源后,自动释放资源,无论资源使用是否正常结束(例如没有异常发生)。语句更加简洁和自动化,且通过上下文管理器,可以对复杂的资源管理过程进行抽象。语句类似,二者的目的是确保清理工作得以执行。例如,文件的关闭操作可以通过。语句被执行时,它会调用上下文管理器的 __enter__()可以自动关闭文件,即使在读取文件时发生异常。,它能够自动管理资源的获取和释放,通常用于。方法,来创建一个自定义的上下文管理器。文件操作是上下文管理器的经典使用场景,方法来管理资源的创建和销毁。

m0_69378371的博客 1124

Matlab信号处理——基于BP神经网络的调制信号分类与识别

如果你想要进一步了解更多的相关知识,可以关注下面公众号联系~会不定期发布相关设计内容包括但不限于如下内容:信号处理、通信仿真、算法设计、matlab appdesigner,gui设计、simulink仿真......希望能帮到你!对信号进行采样和处理,得到了一系列特征参数,包括幅度均值、频率峰值、频率平方均值以及相位标准差、修正后的相位标准差。

小嘤熊的博客 1308

【python】上下文管理器和with语句

有人认为Python中的with语句是一个晦涩难懂的特性,但是只要你了解了其背后的原理,就不会感觉到神秘了。with语句实际上是非常有用的特性,有助于编写清晰易读的Python代码。而上下文管理器存在的目的便是管理with语句,就像迭代器的存在是为了管理for语句一样。那么,究竟 with 语句要怎么用,与之相关的上下文管理器(context manager)是什么,它们之间又有着怎样的联系呢?在任何一门编程语言中,文件的输入输出数据库的连接断开等,都是很常见的资源管理操作。

海哥python的博客 1088

C-08-实战:搭建一个AI客服机器人(接入微信企微)

客服是一人公司最大的时间杀手。本文教你搭建一个AI客服机器人,能自动回答80%的常见问题,只把复杂问题转给人工。含微信公众号和企业微信接入完整代码。

Johnny2004的专栏 88

GB28181 —— 3、C++编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

GB28181 —— Win10下编写GB28181设备端,完成注册、注销、保活心跳、响应查询目录等功能(附源码)

1308

Python上下文管理器

1.与装饰器的区别 上下文管理器是装饰器的近亲,装饰器用于包装函数,上下文管理器用于包装任意代码块. 上下文管理器最常用的场合--作为确保资源被正确清理的一种方式. 2.上下文管理器举例 打开文件-打开文件必须确保其能关闭,这就构成了一种上下文的关系 3.with语句 我们知道with语句打开文件会自动帮我们关闭文件,这个with语句就起到了上下文管理器的作用.下面会介绍原理...

python学习者的博客 1259

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

玩转python中with的使用与上下文管理器

人是随着时间不断进化而来的,同样编程语言也是随着IT行业的更新换代,功能模块不断地优化与丰富才壮大起来的。比如在python2.5之前使用open读写文件操作就要注意。比如Python 程序打开一个文件后,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现 "Too many open files" 的错误,因为系统允许你打开的最大文件数量是有限的,默...

涤生大数据 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python高级编程与实践:Python高级编程技巧与应用

本课程介绍Python进阶编程技巧,包括装饰器、生成器和上下文管理器三大核心内容。装饰器部分讲解基本概念和带参数装饰器的实现;生成器部分涵盖生成器函数和生成器表达式的使用;上下文管理器部分详细说明通过类实现和contextlib模块两种方式。通过这些高级特性,学习者可以编写更高效、更简洁的Python代码,掌握处理复杂问题的能力。课程采用理论讲解与代码示例相结合的方式,帮助学员从基础过渡到高级编程水平。

WSSWWWSSW的博客 648

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 1.4 Python高级编程-迭代器和收集器
ahstudy
博客等级 码龄19年 60粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值