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

Python 四大常用装饰器最全对比

Python 四大常用装饰器最全对比

@abstractmethod/@classmethod/@staticmethod/@property
定义、用法、参数、场景、区别、面试题一次性吃透

一、总览对照表

装饰器传参第一个访问对象访问类能否实例调用核心用途
@abstractmethod不能直接实例定义抽象接口,强制子类重写
@classmethodcls不能类/实例都可操作类属性,工厂方法
@staticmethod不能不能类/实例都可纯工具函数,和类无关
@propertyself不能实例调用把方法变成属性,只读/封装

1. @abstractmethod 抽象方法

所属模块:from abc import ABC, abstractmethod

作用

  1. 定义接口规范,只声明不实现
  2. 强制子类必须重写,否则无法实例化
  3. 抽象类不能直接创建对象

语法

fromabcimportABC,abstractmethodclassAnimal(ABC):@abstractmethoddefcry(self):pass

特点

  • 无默认第一个参数
  • 不能实例化基类
  • 用来做设计模式基类(工厂、策略、模板)

场景

统一接口、插件规范、开闭原则


2. @classmethod 类方法

作用

  1. 绑定,不绑定实例
  2. 第一个参数固定:cls(代表当前类)
  3. 可以修改类变量

语法

classUser:count=0@classmethoddefadd_user(cls):cls.count+=1print("当前人数",cls.count)# 类直接调用User.add_user()# 实例也能调用u=User()u.add_user()

特点

  • 只能访问类属性/类方法
  • 不能访问实例属性self.xxx

常用场景

工厂方法、批量创建对象、类全局统计


3. @staticmethod 静态方法

作用

  1. 和类、实例都无关,就是一个普通函数
  2. 不需要默认参数(无 self / 无 cls)
  3. 只是挂在类里方便管理

语法

classMathUtil:@staticmethoddefadd(a,b):returna+bprint(MathUtil.add(1,2))

特点

  • 不能访问实例属性、不能访问类属性
  • 纯工具、工具类通用

场景

数学计算、格式转换、通用工具函数


4. @property 属性装饰器(最常用)

作用

  1. 把方法伪装成属性调用,不加括号
  2. 封装私有变量,控制读写
  3. 做数据校验、逻辑计算

基础用法(只读)

classPerson:def__init__(self,age):self._age=age@propertydefage(self):# 可以加逻辑校验returnself._age p=Person(18)print(p.age)# 直接当属性用,不用()

可读可写 @xxx.setter

classPerson:def__init__(self,age):self._age=age@propertydefage(self):returnself._age@age.setterdefage(self,value):if0<value<150:self._age=valueelse:raiseValueError("年龄非法")p=Person(20)p.age=30# 赋值触发setterprint(p.age)

场景

字段封装、密码加密、数据校验、懒加载属性


二、四大装饰器核心区别(面试必背)

  1. 实例方法(普通方法):第一个参数self,只能实例调用,操作实例数据
  2. 类方法 @classmethodcls,操作类全局数据
  3. 静态方法 @staticmethod:无参数,纯工具,和类无关
  4. 抽象方法 @abstractmethod:强制重写,定接口
  5. 属性方法 @property:方法变属性,封装字段

三、高频面试真题(直接背答案)

1. classmethod 和 staticmethod 区别

  • classmethodcls,能操作类变量,侧重类业务
  • staticmethod无默认参数,只是挂靠类的普通函数,侧重工具

2. property 作用

封装私有属性,统一访问入口,做参数校验,简化调用,隐藏内部逻辑。

3. 抽象方法能不能有实现?

可以写实现,但子类依旧必须重写,子类可用super()调用父类逻辑。

4. 抽象类可以有构造方法吗?

可以,子类实例化会自动调用。

5. 什么场景用抽象类?

多人协作定接口、框架底层规范、设计模式基类、统一业务行为。


四、最简记忆口诀

  • 强制规范@abstractmethod
  • 操作整个类@classmethod
  • 工具函数@staticmethod
  • 隐藏字段、优雅取值@property

需要我再给你出3道面试手写代码题当场练会吗?

http://www.jsqmd.com/news/852472/

相关文章:

  • 外贸模板建站服务商推荐,2026年高适配款出炉 - FaiscoJeff
  • docker启动线程创建异常 pthread_create EPERM | RuntimeError: can‘t start new thread
  • VSCode在Ubuntu/WSL2里保存文件总报permission denied?可能是这个虚拟化环境特有的坑
  • 2026仓库管理软件厂家优选指南:中小企业数字化仓储选型必看 - 深度智识库
  • Dify工作流引擎架构演进:从低代码到智能编排的技术深度解析
  • 浏览器端音乐文件解密技术深度解析:Unlock Music项目架构与实现原理
  • Perplexity习语查询功能实战指南:3步精准定位地道表达,告别中式英语(附12个高频误用对照表)
  • Windows上的B站原生客户端:如何告别浏览器卡顿,享受丝滑观看体验?
  • AnyKernel3终极指南:5分钟打造通用Android内核刷机包
  • 2026年5月最新美度官方售后网点权威数据验证报告(含迁址新开)实地考察多方对比 - 亨得利官方服务中心
  • 绝绝子!输入关键词,这几款AI论文工具直接生成结构完整的毕业论文
  • GRO淘金优化算法实战:5个工程优化问题调参与性能对比
  • 2026年宁夏注塑机销售公司版图:区域服务商全链路服务分析报告出炉! - 深度智识库
  • 2026东莞户外蚊虫防控全攻略:选型、避坑与实测推荐 - 品牌优选官
  • 别再让VmmemWSL吃光你的内存!手把手教你用.wslconfig给Docker on WSL2瘦身
  • Claude Code 扩展体系
  • DeepSeek R1模型API调用性能对比:v1.2 vs v2.1吞吐量提升47%,但90%开发者忽略了这个Header配置
  • Windows风扇控制终极指南:用FanControl打造静音高效的电脑散热系统
  • 古籍检索效率提升300%的关键一步,Perplexity诗词搜索的隐式韵律建模与跨朝代语义桥接方法论
  • 【Linux内核模块】导出符号详解:模块间的“资源共享”机制
  • 独立开发者如何借助 Taotoken 实现单一应用对接多个主流大模型
  • 抖音视频怎么下载?2026年抖音视频提取方法全解析及工具对比 - 爱上科技热点
  • 矩阵系统的“人效革命“:一个人如何干出一个团队的活?
  • 别再让用户填错表了!用EasyExcel 3.x + POI 4.1.2给Excel模板表头加批注(附完整代码)
  • 单周期CPU设计避坑指南:我在Logisim里调试MIPS指令的那些事儿
  • 3步解锁百度网盘SVIP:从龟速到极速的终极指南
  • 2026济南婚纱照排名|拍摄基地与场景资源TOP5权威评测 - charlieruizvin
  • 深度解读物理AI:人工智能的下一个主战场!
  • 5分钟解锁音乐格式壁垒:Unlock Music开源工具深度解析与实践指南
  • 南京厌学心理咨询机构助力青少年重拾学习动力 - 品牌排行榜