巧用9个Python内置装饰器,大幅优化代码(下)

图片

图片

5. @cached_property:将方法的结果缓存为属性

Python 3.8引入了一个新的、强大的装饰器@cached_property,它位于functools模块中。它可以将一个类的方法转换为一个属性,该属性的值在实例的生命周期内只计算一次,并作为普通属性进行缓存。

下面是一个示例:

from functools import cached_property


class Circle:
    def __init__(self, radius):
        self.radius = radius

    @cached_property
    def area(self):
        return 3.14 * self.radius ** 2


circle = Circle(10)
print(circle.area)
# 打印314.0
print(circle.area)
# 直接返回缓存的结果(314.0)

在上述代码中,我们通过@cached_propertyarea方法进行了装饰。因此,对于相同的未更改实例的circle.area,不会进行重复计算。

6. @classmethod:在Python类中定义类方法

在Python类中,有三种可能的方法类型:

  • **实例方法:**绑定到实例的方法。它们可以访问和修改实例数据。实例方法是在类的实例上调用的,并且可以通过self参数访问实例数据。
  • **类方法:**绑定到类的方法。它们无法修改实例数据。类方法是在类本身上调用的,并且作为第一个参数接收类,按惯例命名为cls
  • **静态方法:**不绑定到实例或类的方法。

只要实例方法的第一个参数是self,它就可以定义为普通的Python函数。然而,要定义一个类方法,我们需要使用@classmethod装饰器。

为了演示,下面的示例定义了一个类方法,可以用来通过直径获取一个Circle实例:

class Circle:
    def __init__(self, radius):
        self.radius = radius

    @classmethod
    def from_diameter(cls, diameter):
        return cls(diameter / 2)

    @property
    def diameter(self):
        return self.radius * 2

    @diameter.setter
    def diameter(self, diameter):
        self.radius = diameter / 2


c = Circle.from_diameter(8)
print(c.radius)  # 4.0
print(c.diameter)  # 8.0

7. @staticmethod:在Python类中定义静态方法

正如前面提到的,静态方法不绑定到实例或类,它们仅仅因为在逻辑上属于该类而被包含在类中。

静态方法通常用于执行一组相关任务的实用类,例如数学计算。通过在类中将相关函数组织成静态方法,我们的代码会变得更加组织有序,也更容易理解。

要定义静态方法,我们只需要使用@staticmethod装饰器。接下来看一个例子:

class Student:
    def __init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
        self.nickname = None

    def set_nickname(self, name):
        self.nickname = name

    @staticmethod
    def suitable_age(age):
        return 6 <= age <= 70


print(Student.suitable_age(99)) # False
print(Student.suitable_age(27)) # True
print(Student('yang', 'zhou').suitable_age(27)) # True

8. @dataclass:使用更少的代码定义特殊类

@dataclass装饰器(在Python 3.7中引入)可以自动生成一个类的多个特殊方法,例如__init____repr____eq____lt__等。

因此,它可以节省我们编写这些基本方法所需的大量时间。如果一个类主要用于存储数据,那么@dataclass装饰器就能为开发者提供很大的帮助。

下面的示例仅定义了一个名为Point的类的两个数据字段。有了@dataclass装饰器,我们只需要这些代码就足够了:

from dataclasses import dataclass

@dataclass
class Point:
    x: float
    y: float

point = Point(1.0, 2.0)
print(point)
# Point(x=1.0, y=2.0)

9. @atexit.register:注册在程序正常终止时执行的函数

来自atexit模块的@register装饰器可以使我们在Python解释器退出时执行一个函数。

这个装饰器对于执行最终任务非常有用,例如释放资源或者只是打个招呼道别!👋

以下是一个示例:

import atexit

@atexit.register
def goodbye():
    print("Bye bye!")

print("Hello Yang!")

输出结果为:

Hello Yang!
Bye bye!

正如示例所示,由于使用了@register装饰器,即使我们没有显式调用goodbye函数,终端也会输出“Bye bye!”。

结语

综上所述,我们介绍了9个Python内置装饰器,它们可以在很多情况下大幅优化我们的代码。这些装饰器为我们提供了强大的工具来优化和改进代码。通过熟练掌握这些装饰器的使用,我们可以写出更加高效和优雅的Python代码。

关于Python学习指南

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

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

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

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值