【 Python 全栈开发 - WEB开发篇 - 38 】property和上下文管理器

这篇具有很好参考价值的文章主要介绍了【 Python 全栈开发 - WEB开发篇 - 38 】property和上下文管理器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、property

1.1 简介

Python 是一个简洁而强大的编程语言,通过提供各种特性和工具,使开发人员能够更高效地进行编程。其中一个非常有用的特性是@property装饰器,它允许我们在类中定义属性并自定义其行为。

1.2 @property装饰器

@property装饰器用于将一个方法转换为类的属性。使用@property装饰器,我们可以像访问属性一样访问该方法,而不是调用它。@property装饰器的语法如下所示:

@property
def attribute(self):
    # 代码逻辑
    return value

1.3 只读属性

@property装饰器最常用的用途之一是创建只读属性。只读属性是指一旦设置了初始值,就无法再次更改该值。下面是一个示例代码,演示如何使用@property装饰器实现只读属性:

class Circle:
    def __init__(self, radius):
        self._radius = radius
    
    @property
    def radius(self):
        return self._radius
    
circle = Circle(5)
print(circle.radius)  # 输出:5
circle.radius = 10  # 报错:AttributeError: can't set attribute

在上面的代码中,我们定义了一个Circle类,它具有一个私有属性_radius。使用@property装饰器,我们将radius方法转换为类的属性。在访问Circle对象的radius属性时,实际上调用了radius方法。由于radius方法没有setter方法,因此无法更改radius的值,从而实现了只读属性。

1.4 只写属性

与只读属性类似,只写属性是指我们只能更改属性的值,而无法访问或获取该值。下面是一个示例代码,演示如何使用@property装饰器实现只写属性:

class Rectangle:
    def __init__(self):
        self._width = 0
        self._height = 0
    
    @property
    def width(self):
        pass
    
    @width.setter
    def width(self, value):
        self._width = value
    
    @property
    def height(self):
        pass
    
    @height.setter
    def height(self, value):
        self._height = value
    
rectangle = Rectangle()
rectangle.width = 10
rectangle.height = 20
print(rectangle.width)  # 输出:0
print(rectangle.height)  # 输出:0
rectangle.width = 30  # 无法修改只写属性,不报错也不生效

在上面的代码中,我们定义了一个Rectangle类,它具有两个私有属性_width_height。通过定义两个方法widthheight,并使用@property装饰器转换为类的属性,我们实现了只写属性。在这种情况下,我们可以通过设置widthheight属性来更改其值,但无法通过访问这些属性来获取其值。

1.5 可读写属性

除了只读属性和只写属性,我们也可以使用@property装饰器实现可读写属性。可读写属性是指我们既可以通过访问属性来获取其值,也可以通过设置属性来更改其值。下面是一个示例代码,演示如何使用@property装饰器实现可读写属性:

class Square:
    def __init__(self):
        self._side = 0
    
    @property
    def side(self):
        return self._side
    
    @side.setter
    def side(self, value):
        self._side = value
    
square = Square()
square.side = 5
print(square.side)  # 输出:5

在上面的代码中,我们定义了一个Square类,它具有一个私有属性_side。通过定义一个方法side,并使用@property装饰器将其转换为类的属性,我们实现了可读写属性。在这种情况下,我们可以通过访问和设置side属性来获取和更改其值。

1.6 属性删除

除了对属性的获取和设置,@property装饰器还允许我们定义一个方法来删除属性。删除属性是指从对象中删除属性及其值。下面是一个示例代码,演示如何使用@property装饰器实现属性删除:

class Person:
    def __init__(self, name):
        self._name = name
    
    @property
    def name(self):
        return self._name
    
    @name.deleter
    def name(self):
        del self._name
    
person = Person("Alice")
print(person.name)  # 输出:Alice
del person.name
print(person.name)  # 报错:AttributeError: 'Person' object has no attribute '_name'

在上面的代码中,我们定义了一个Person类,它具有一个私有属性_name。通过定义一个方法name,并使用@property装饰器将其转换为类的属性,我们实现了可读写属性。通过定义name.deleter方法,我们实现了属性删除。在这种情况下,我们可以使用del语句删除person对象的name属性。

1.7 应用场景

@property装饰器在许多情况下都非常有用,特别是在设计类的接口时。一些常见的应用场景包括:

  • 对属性值进行验证和限制
  • 对属性进行加密或解密
  • 对属性进行计算或转换
  • 对属性进行缓存

    @property装饰器是 Python 中一个非常有用的特性,它允许我们在类中定义属性并自定义其行为。通过使用@property装饰器,我们可以轻松实现只读属性、只写属性、可读写属性和属性删除等功能。这种灵活性使得@property装饰器在代码设计中非常有用,并且可以应用于各种不同的场景。

二、上下文管理器

Python 的上下文管理器是一种在处理资源(例如文件、网络连接等)时非常有用的机制。它可以确保在处理完资源之后,资源能够被正确关闭或清理,从而避免资源泄露或损坏。

什么是上下文管理器
使用上下文管理器
2.1 使用with语句
2.2 自定义上下文管理器类
2.3 使用contextlib模块
常见的上下文管理器
3.1 文件对象的上下文管理器
3.2 网络连接的上下文管理器
结论

2.1 什么是上下文管理器

上下文管理器是一个实现了__enter__()__exit__()方法的对象。这两个方法定义了在进入和退出上下文时需要执行的操作。

  • __enter__()方法:在进入上下文之前调用该方法。通常在该方法中执行资源的获取和初始化操作,并返回一个与资源相关联的对象。
  • __exit__()方法:在退出上下文时调用该方法。通常在该方法中执行资源的关闭和清理操作,并接收异常信息作为参数。

上下文管理器还可以使用with语句来简化资源的获取和释放过程。with语句会自动调用上下文管理器的__enter__()__exit__()方法,使得代码更加简洁和可读。

2.2 使用上下文管理器

2.2.1 使用with语句

让我们首先看一个使用with语句的例子,以文件对象为例:

with open('file.txt', 'r') as file:
    data = file.read()
    print(data)

在上面的代码中,open()函数返回一个文件对象,我们将其赋值给变量file。然后,在with语句中,我们可以通过file对象读取文件的内容,并打印出来。当with代码块执行完毕后,文件对象会自动被关闭,无需手动调用close()方法。

2.2.2 自定义上下文管理器类

除了使用内置的上下文管理器(例如文件对象),我们还可以自定义上下文管理器类来管理其他类型的资源。下面是一个自定义上下文管理器类的示例,用于模拟数据库连接的获取和释放:

class DatabaseConnection:
    def __init__(self, host, port):
        self.host = host
        self.port = port

    def __enter__(self):
        self.connect()  # 模拟数据库连接的获取
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        self.close()  # 模拟数据库连接的关闭

    def connect(self):
        print(f"Connecting to database at {self.host}:{self.port}")

    def close(self):
        print("Closing database connection")


with DatabaseConnection('localhost', '3306') as db:
    # 执行数据库操作
    print("Executing SQL queries")

在上述代码中,我们定义了一个名为DatabaseConnection的上下文管理器类。在__enter__()方法中,我们模拟了数据库连接的获取操作,并返回了与数据库连接相关联的对象。在__exit__()方法中,我们模拟了数据库连接的关闭操作。

with语句中,我们实例化了DatabaseConnection对象,并将其赋值给变量db。然后,我们可以通过db对象执行数据库操作。当with代码块执行完毕后,__exit__()方法会自动被调用,从而关闭数据库连接。

2.2.3 使用contextlib模块

除了定义类来实现上下文管理器外,我们还可以使用contextlib模块提供的装饰器和上下文管理器生成器来简化代码。下面是一个使用contextlib模块的示例:

from contextlib import contextmanager

@contextmanager
def database_connection(host, port):
    # 模拟数据库连接的获取
    print(f"Connecting to database at {host}:{port}")

    yield  # 这里是with语句中的代码块

    # 模拟数据库连接的关闭
    print("Closing database connection")

with database_connection('localhost', '3306') as db:
    # 执行数据库操作
    print("Executing SQL queries")

在上述代码中,我们使用了contextmanager装饰器将一个生成器函数database_connection()转换为上下文管理器。在生成器函数中,我们可以在yield关键字处定义with语句中的代码块。在yield之前的代码会在进入上下文时执行,而在yield之后的代码会在退出上下文时执行。

with语句中,我们调用database_connection()生成器函数,并将其赋值给变量db。然后,我们可以通过db对象执行数据库操作。当with代码块执行完毕后,生成器函数会继续执行yield之后的代码,从而关闭数据库连接。

2.3 常见的上下文管理器

除了文件对象和数据库连接之外,Python 标准库还提供了许多其他常见的上下文管理器,例如:

2.3.1 文件对象的上下文管理器

文件对象是最常见的上下文管理器之一。使用open()函数打开文件时,可以使用with语句来确保文件在使用完毕后被正确关闭。这是 Python 中处理文件的推荐方式,可以有效地避免资源泄露和文件损坏。

下面是一个使用文件对象上下文管理器的示例:

with open('file.txt', 'w') as file:
    file.write('Hello, World!')

在上面的代码中,我们使用open()函数打开文件file.txt,并赋值给变量file。然后,在with语句中,我们使用file.write()方法向文件中写入一行文本。当with代码块执行完毕后,文件对象会自动被关闭,无需手动调用file.close()方法。

2.3.2 网络连接的上下文管理器

在处理网络连接时,上下文管理器也非常有用。例如,如果使用socket库进行网络通信,可以使用with语句来确保网络连接在使用完毕后被正确关闭。

下面是一个使用socket库的上下文管理器的示例:

import socket

with socket.create_connection(('localhost', 80)) as conn:
    # 使用连接执行网络操作
    print("Sending data over network")

在上面的代码中,我们使用socket.create_connection()函数创建一个网络连接,并将其赋值给变量conn。然后,在with语句中,我们可以使用conn对象执行网络操作。当with代码块执行完毕后,网络连接会自动关闭。


上下文管理器是 Python 中用于管理资源的重要工具。它可以确保资源的正确获取和释放,避免资源泄露和损坏。通过合理使用上下文管理器,我们可以使代码更加简洁、可读和健壮。如果你在编写 Python 代码时经常需要处理资源,那么上下文管理器将成为你的得力助手。文章来源地址https://www.toymoban.com/news/detail-536550.html

到了这里,关于【 Python 全栈开发 - WEB开发篇 - 38 】property和上下文管理器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python 上下文管理器 with 语句

    上下文管理器 with 语句可以自动地分配和释放资源。 这篇文章中介绍了文件读写的方法,每次读取文件时要使用 open() 函数打开文件,使用结束后要用 close() 函数关闭文件。有时,我们会忘记关闭文件,或者打开了许多文件占用太多资源。使用上下文管理器 with 语句可以方便

    2023年04月09日
    浏览(58)
  • Python教程(27)——如何使用Python中的上下文管理器

    当我们在编写代码时,经常会遇到需要管理资源的情况,比如打开和关闭文件,如果遇到了一些异常情况,我们需要关闭资源,不然会导致资源泄露,虽然我们可以通过手动的方式来关闭,但如果有多个异常情况需要考虑的话,万一不小心漏了一处,就芭比Q了。所以,如果有

    2024年02月19日
    浏览(54)
  • Python高级语法:with语句和上下文管理器

    1.文件操作说明: ①文件使用完后必须关闭。 ②因文件对象会占用操作系统的资源,并且操作系统同一时间能打开的文件数量也是有限的。 例如:  2. 存在的安全隐患: ① 由于文件读写时都有可能产生IOError,一旦出错,后面的f.close()就不会调用。 例如: 运行结果: 3.try…except…

    2024年02月04日
    浏览(59)
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景一

    1.获取应用文件路径 基类Context提供了获取应用文件路径的能力,ApplicationContext、AbilityStageContext、UIAbilityContext和ExtensionContext均继承该能力。应用文件路径属于应用沙箱路径。上述各类Context获取的应用文件路径有所不同。 通过ApplicationContext获取应用级别的应用文件路径,此路

    2024年02月11日
    浏览(57)
  • HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景二

    3.创建其他应用或其他Module的Context 基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string),创建其他应用或者其他Module的Context,从而通过该Context获取相应的资源信息(例如获取其他Module的获取应用开发路径信息)。 调用createModuleContext(moduleNa

    2024年02月11日
    浏览(59)
  • 超长上下文处理:基于Transformer上下文处理常见方法梳理

    原文链接:芝士AI吃鱼 目前已经采用多种方法来增加Transformer的上下文长度,主要侧重于缓解注意力计算的二次复杂度。 例如,Transformer-XL通过缓存先前的上下文,并允许随着层数的增加线性扩展上下文。Longformer采用了一种注意力机制,使得token稀疏地关注远距离的token,从而

    2024年02月13日
    浏览(52)
  • 无限上下文,多级内存管理!突破ChatGPT等大语言模型上下文限制

    目前,ChatGPT、Llama 2、文心一言等主流大语言模型,因技术架构的问题上下文输入一直受到限制,即便是Claude 最多只支持10万token输入,这对于解读上百页报告、书籍、论文来说非常不方便。 为了解决这一难题,加州伯克利分校受操作系统的内存管理机制启发,提出了MemGPT。

    2024年02月06日
    浏览(64)
  • 从零开始理解Linux中断架构(7)--- Linux执行上下文之中断上下文

            当前运行的loop是一条执行流,中断程序运行开启了另外一条执行流,从上一节得知这是三种跳转的第三类,这个是一个大跳转。对中断程序的基本要求就是 中断执行完毕后要恢复到原来执行的程序 ,除了时间流逝外,原来运行的程序应该毫无感知。        

    2024年02月11日
    浏览(67)
  • 【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-在表单里拿到列表上下文onlineTableContext

    【二开】JeecgBoot-vue3二次开发 前端 扩展online表单js增强等-在表单里拿到列表上下文 对应的属性方法 acceptHrefParams \\\"p 跳转时获取的参数信息\\\" currentPage \\\"p 当前页数\\\" currentTableName \\\"p 当前表名\\\" description \\\"p 当前表描述\\\" hasChildrenField \\\"p 是否有子节点的字段名,仅树形表单下有效\\\" is

    2024年02月15日
    浏览(44)
  • 安信可开发环境构建-基于Ai-WB2系列 和 Ai-M61 或 Ai-M62 (环境上下文切换)

    首先,对于Ai-WB2系列环境的构建官方文档已经讲的非常明白了,这里不做阐述 如下链接所示https://blog.csdn.net/Boantong_/article/details/128480919  本人亲自测试可行 ,请严格follow官方的steps。 另外需要注意的是,为了避免错误,尽量不要自己从GIT或者Gitee拉取项目。使用上述链接内,

    2024年02月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包