当前位置: 首页 > news >正文

Python基础篇_修饰符(Decorators)【上】

下一篇:Python基础篇_修饰符(Decorators)【中】@property、@<attribute_name>.setter、@<attribute_name>.deleter、@functools.lru_cache(maxsize=None)

 Python基础篇_修饰符(Decorators)【上】

  • Python基础篇_修饰符【上】
    • 一、修饰符一般特点
    • 二、常用的修饰符以及用法举例
      • 1) @decorator,装饰器
      • 2) @classmethod,类方法
      • 3) @staticmethod,静态方法

Python基础篇_修饰符【上】

    Python中有多种修饰符,这些修饰符用于指定方法的特殊行为或属性,也是用于修改函数行为的特殊参数。

一、修饰符一般特点

  1. 修饰符只能用于类定义中,不能用于普通函数中
  2. 属性修饰符是可叠加的,也就是说,一个方法可以同时被多个属性修饰符修饰

二、常用的修饰符以及用法举例

1) @decorator,装饰器

    @decorator装饰器是一种修改函数行为的特殊函数,它接受一个函数作为参数,并返回一个新的函数。通过在函数声明前加上 @decorator 修饰符,可以将装饰器应用于该函数。

示例1:使用装饰器打印函数执行时间

import timedef timer_decorator(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()print(f"Function {func.__name__} took {end_time - start_time} seconds to execute.")return resultreturn wrapper@timer_decorator
def my_function():time.sleep(2)  # 模拟耗时操作return "Hello, World!"result = my_function()
print(result)  # 输出:Hello, World!
print(f"Function {my_function.__name__} took {time.time() - end_time} seconds to execute.")  # 输出:Function my_function took 2.0003339641967773 seconds to execute.

示例2:使用装饰器检查函数参数类型

def check_params_decorator(func):def wrapper(*args, **kwargs):for arg in args:if not isinstance(arg, int):raise ValueError("All arguments must be integers.")for key, value in kwargs.items():if not isinstance(value, int):raise ValueError(f"{key} must be an integer.")return func(*args, **kwargs)return wrapper@check_params_decorator
def my_function(a, b, c=3):return a + b + cresult = my_function(1, 2, 4)  # 输出:6
result = my_function(1, "2", 4)  # 抛出 ValueError 异常:All arguments must be integers.

示例3:使用装饰器检查函数返回值类型

def check_return_value_decorator(func):def wrapper(*args, **kwargs):result = func(*args, **kwargs)if not isinstance(result, int):raise ValueError("The function must return an integer.")return resultreturn wrapper@check_return_value_decorator
def my_function():return "Hello, World!"  # 抛出 ValueError 异常:The function must return an integer.

2) @classmethod,类方法

    @classmethod: 用于定义类方法,类方法可以访问和修改类属性,可以通过类来调用,不需要实例化对象。类方法的第一个参数通常被命名为cls,表示类本身

示例1:使用类方法计算两个数的和

class Calculator:@classmethoddef add(cls, x, y):return x + yresult = Calculator.add(2, 3)
print(result)  # 输出:5

示例2:使用类方法访问类的静态属性

class MyClass:value = 10@classmethoddef get_value(cls):return cls.valueresult = MyClass.get_value()
print(result)  # 输出:10

示例3:使用类方法实现类的工厂方法模式

class Shape:@classmethoddef create(cls, name):if name == "Circle":return cls()._create_circle()elif name == "Square":return cls()._create_square()else:raise ValueError("Invalid shape name.")def _create_circle(self):return "Circle"def _create_square(self):return "Square"在这个示例中,Shape 类定义了一个 create 类方法,它根据传入的名称参数返回不同类型的形状。
通过调用 Shape 类的 create 方法,可以创建不同类型的形状对象。
如果传入的名称参数无效,则抛出 ValueError 异常。

3) @staticmethod,静态方法

    静态方法是一种不需要实例化对象就可以调用的方法,它与类关联而不是与实例关联,静态方法既不访问实例属性,也不访问类属性,更不需要实例化对象即可调用。它在类中的定义类似于普通函数;静态方法的不需要self参数;

示例1:使用静态方法计算两个数的乘积

class Calculator:@staticmethoddef multiply(x, y):return x * yresult = Calculator.multiply(2, 3)
print(result)  # 输出:6

示例2:使用静态方法获取类的静态属性

class MyClass:value = 10@staticmethoddef get_value():return MyClass.valueresult = MyClass.get_value()
print(result)  # 输出:10

示例3:使用静态方法执行无参操作

class FileOperation:@staticmethoddef log_message(message):print(message)FileOperation.log_message("Hello, World!")  # 输出:Hello, World!

may the odds be ever in your favor ~

相关文章:

  • 深入探索 Express.js 的高级特性
  • SpringCloud-Eureka原理分析
  • RK3588平台开发系列讲解(Camera篇)使用v4l2-ctl抓图
  • 电力负荷预测 | 电力系统负荷预测模型(Python线性回归、随机森林、支持向量机、BP神经网络、GRU、LSTM)
  • CAN通讯协议详解
  • 基于Linux操作系统的Docker容器安装MySQL随笔
  • 微软.NET6开发的C#特性——委托和事件
  • vue基本语法总结大全
  • 【开源】JAVA+Vue.js实现高校实验室管理系统
  • Ubuntu 22 部署Zabbix 6.4
  • LeetCode、216. 组合总和 III【中等,组合型枚举】
  • Linux介绍和命令使用
  • 办公软件巨头CCED、WPS面临新考验,新款办公软件异军突起
  • 计算机设计大赛 深度学习 python opencv 火焰检测识别
  • unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题
  • .pyc 想到的一些问题
  • CentOS从零开始部署Nodejs项目
  • eclipse的离线汉化
  • HTTP中GET与POST的区别 99%的错误认识
  • SegmentFault 2015 Top Rank
  • yii2中session跨域名的问题
  • 回顾 Swift 多平台移植进度 #2
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 七牛云假注销小指南
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • k8s使用glusterfs实现动态持久化存储
  • 第二十章:异步和文件I/O.(二十三)
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • #Linux(权限管理)
  • #传输# #传输数据判断#
  • #大学#套接字
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (1)(1.11) SiK Radio v2(一)
  • (12)目标检测_SSD基于pytorch搭建代码
  • (7)STL算法之交换赋值
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (图)IntelliTrace Tools 跟踪云端程序
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)菜鸟学数据库(三)——存储过程
  • (转)大型网站架构演变和知识体系
  • (转载)利用webkit抓取动态网页和链接
  • .net MVC中使用angularJs刷新页面数据列表
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Bean注解详解
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [ACM] hdu 1201 18岁生日