news 2026/4/23 14:22:47

【python 基础】装饰器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【python 基础】装饰器

前言:

一旦你在一个函数上方添加了@property,这个函数就不再是一个普通的“方法(Method)”了,它被转化成了一个属性对象(Property Object)/ 描述符(Descriptor)

我们可以把这个过程拆解得更深一点,看看 Python 背后到底发生了什么:

1. 这种转化的本质

在 Python 内部,当你定义:

@property def segmap(self): return self._current_segmap

这等同于执行了:segmap = property(fget=segmap)

此时,segmap变成了一个特殊的容器。这个容器里装载了你定义的那个函数,并且自动拥有了几个“口袋”(方法):

  • .getter

  • .setter

  • .deleter


2. 为什么需要这个“属性对象”?

如果它只是个普通函数,当你写cam.segmap = data时,Python 会直接把data覆盖掉你的函数,导致你的segmap函数消失。

但因为它是属性对象

  1. 当你执行赋值(=) 时,Python 发现segmap是个属性对象,它不会去覆盖它,而是去翻segmap的口袋,寻找.setter里的逻辑。

  2. 如果你没定义.setter就去赋值,Python 会直接报错:AttributeError: can't set attribute。这就是为什么@property默认是只读的。


3. 验证一下:它是“对象”还是“函数”?

我们可以通过一段简单的代码来看看它的“真身”:

class Camera: @property def segmap(self): return "some data" # 注意:我们直接通过【类名】而不是【实例】去查看 print(type(Camera.segmap)) # 输出:<class 'property'> <-- 看!它已经不是 function 了,而是 property 类型

4. 举个例子:如果你改了名字

如果你把名字从segmap改成pizza,那么装饰器也必须跟着变:

class MyClass: @property def pizza(self): # 这里决定了属性对象的名字叫 pizza return self._sauce @pizza.setter # 注意!这里必须跟着叫 @pizza.setter def pizza(self, value): self._sauce = value

总结本质:装饰器property 就是为了改变函数为对象,让函数具备属性。 所以对于装饰器的函数,

5.@property(Getter) 部分:禁止传参

当你写@property时,你是在定义一个“属性”。在 Python 的逻辑里,属性应该是直接获取的,而不应该是被“计算”出来的(需要输入参数的那种叫方法)

  • 错误写法:

    @property def segmap(self, mode): # ❌ 报错!Getter 不能接受额外参数 return self._current_segmap
  • 正确写法:

    @property def segmap(self): # ✅ 只能有 self return self._current_segmap

为什么?因为你访问它时是写cam.segmap。这里没有任何括号()给你放参数的地方。


6.@segmap.setter部分:必须接受一个参数

虽然@property函数不能带参数,但对应的Setter 函数必须带且只能带一个参数(通常叫value)。

  • 内部逻辑:当你写cam.segmap = [1, 0, 1]时,等号右边的整个[1, 0, 1]就会被 Python 解释器当作实参,自动传给 Setter 函数。

@segmap.setter def segmap(self, value): # 这个 value 接收等号右边的值 self._current_segmap = value

7. 如果我真的需要带参数怎么办?

如果你发现自己很想给segmap传参数(比如cam.get_segmap(mode='binary')),那么这个时候你就不应该使用@property

你应该直接定义一个普通的方法(Method):

场景应该使用...调用方式
不需要参数(直接拿取/修改)@propertya = cam.segmap
需要参数(需要根据条件计算)普通函数 (Method)a = cam.get_segmap(mode='raw')
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:17:50

FSMN VAD社区贡献指南:如何参与二次开发

FSMN VAD社区贡献指南&#xff1a;如何参与二次开发 1. 为什么FSMN VAD值得你投入时间参与开发&#xff1f; FSMN VAD是阿里达摩院FunASR项目中开源的语音活动检测&#xff08;Voice Activity Detection&#xff09;模型&#xff0c;以轻量、高精度、低延迟著称。它仅1.7MB大…

作者头像 李华
网站建设 2026/4/23 9:18:26

unet人像卡通化移动端适配进展:未来功能前瞻分析

UNet人像卡通化移动端适配进展&#xff1a;未来功能前瞻分析 1. 项目起源与核心能力 UNet人像卡通化工具不是凭空出现的玩具&#xff0c;而是从真实需求里长出来的解决方案。科哥在日常内容创作中反复遇到一个问题&#xff1a;想快速把真人照片变成有辨识度又不失趣味的卡通形…

作者头像 李华
网站建设 2026/4/23 9:17:34

训练失败常见问题:cv_resnet18_ocr-detection排错手册

训练失败常见问题&#xff1a;cv_resnet18_ocr-detection排错手册 OCR文字检测模型的训练过程看似简单&#xff0c;实则暗藏诸多“坑点”。尤其在使用cv_resnet18_ocr-detection这一基于ResNet-18主干网络构建的轻量级OCR检测模型时&#xff0c;新手常因数据格式、路径配置、参…

作者头像 李华
网站建设 2026/4/23 9:20:24

Z-Image-Turbo性能实测:Diffusers推理库优化部署案例

Z-Image-Turbo性能实测&#xff1a;Diffusers推理库优化部署案例 1. 为什么Z-Image-Turbo值得你花5分钟了解 你有没有试过等一张AI图生成要半分钟&#xff1f;或者在本地显卡上跑不动大模型&#xff0c;只能眼睁睁看着别人出图&#xff1f;Z-Image-Turbo就是为解决这些问题而…

作者头像 李华
网站建设 2026/4/23 9:17:36

Speech Seaco Paraformer企业应用案例:智能客服语音分析系统搭建教程

Speech Seaco Paraformer企业应用案例&#xff1a;智能客服语音分析系统搭建教程 1. 为什么企业需要自己的语音分析系统&#xff1f; 你有没有遇到过这些情况&#xff1f; 客服团队每天要听上百通录音&#xff0c;手动整理客户投诉要点&#xff1b; 质检部门靠抽查几条录音做…

作者头像 李华
网站建设 2026/4/23 10:48:41

金融文档纠错场景应用:BERT掩码模型企业落地案例

金融文档纠错场景应用&#xff1a;BERT掩码模型企业落地案例 1. 为什么金融文档特别需要“智能填空”能力 你有没有遇到过这样的情况&#xff1a;一份刚起草完的信贷合同里&#xff0c;某处写着“本协议自双方签字盖章之日[MASK]生效”&#xff0c;或者风险评估报告中出现“该…

作者头像 李华