假发魔法:一秒把函数变属性的@Property秘术
假设我们有这么一个类:
class Dog:
def __init__(self, name):
self._name = name
@property
def name(self):
return f"My name is {self._name}!"
那么,重点来了:@property
到底是个什么东西?
想象一下你是个“程序员开宠物店”的老板,这里你养了一只小狗,起名叫旺财。你给它写了个“自我介绍”的方法:name()
。
你本来要这样问它名字:
dog = Dog("旺财")
print(dog.name()) # 像是在喊:旺财,说下你的名字!
但是你觉得这样有点不自然,现实中我们不是这么和狗说话的啊! 我们更想自然地写:
print(dog.name) # 旺财,名字是什么呀?
于是你用了神奇的装饰器:@property
!
它就像给一个“方法”戴上了**“属性的假发”** 🎩,把方法伪装成属性。于是别人看不出来它其实是函数,还以为你真的定义了个变量 name
,但背后其实是在执行函数逻辑!
那它有什么用呢?
功能 | 举例 | 意义 |
---|---|---|
👻 把函数伪装成属性 | dog.name 其实是函数 |
让你写起来优雅,读起来自然 |
🔒 可以只读 | 没有 setter 时不能改 | 防止别人偷偷改掉变量 |
🧠 可做逻辑处理 | 返回值可以动态生成 | 比如 体重单位转换 、自动拼接格式 等 |
举个生活化的例子:
你是一个魔法师,有个魔法球,你问它“天气如何”:
magic_ball.weather() # 需要加括号,好麻烦!
你给它套个 @property
:
@property
def weather(self):
return "风和日丽,适合出门装逼!"
从此你只要:
print(magic_ball.weather)
别人以为你在读个天气变量,其实你在执行神秘魔法!
❗再来个小彩蛋:
如果你还希望这个属性可以设置(写),可以再加上 .setter
:
class Dog:
def __init__(self, name):
self._name = name
@property
def name(self):
return self._name
@name.setter
def name(self, new_name):
print(f"给狗改名字啦!新名字叫:{new_name}")
self._name = new_name
现在你可以:
dog.name = "小黑" # 不用再调用 set_name 方法啦!
总结成一句话:
@property
就像是给函数贴上了“我不是函数我是变量”的标签,让你写起来优雅,读起来自然,用起来顺手,看起来高端,还能在背后偷偷搞事(比如格式化、单位换算、权限控制)!
Python核心知识唠明白 文章被收录于专栏
想学Python怕被线程池|元组解包劝退?本专栏用打工人打工魂|拆快递|交换奶茶的生活化比喻,把核心知识点讲成唠家常!从线程池原理到元组解包技巧,每篇带代码实战+避坑指南,小白边看边练,无痛掌握。新手入门、老萌新优化代码都适用;学完直接上手批量下载、处理Excel、优化爬虫,Python原来这么简单好玩!