You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中为何用__xxx__格式定义函数属性?能否为函数动态添加属性?

关于Python装饰器中函数属性命名的疑问解答

嘿,作为Python新手能留意到这个细节真的超棒!我来逐个帮你拆解这些问题:

1. 为什么用__method__、__route__这种双下划线格式定义属性?

你说得没错,__xxx__格式通常是Python用来定义特殊内置方法/属性的(比如__init__、__str__、__name__这些)。但在这个装饰器里,这么做主要是框架约定的一种标识方式:
这类Web框架(比如类似Flask的自定义路由实现)会在后续的路由注册逻辑里,遍历所有函数,专门检查有没有这类命名的属性——用双下划线命名可以避免和函数的普通属性冲突,让框架能精准识别出哪些函数是需要绑定到特定路由和请求方法的。

2. 这种做法是否推荐?

严格来说,PEP8(Python代码风格指南)并不推荐自定义__xxx__格式的属性,因为这个命名空间是Python官方保留给内置特殊方法和属性的。如果自己随意定义,未来Python版本新增同名内置属性时,就会出现冲突问题。

不过也有例外:如果是在某个成熟框架的生态里写代码,框架本身就约定了这种用法(比如早期的一些路由实现),那跟着框架走没问题。但如果是自己写独立的代码,更稳妥的做法是用单下划线前缀(比如_method、_route)或者普通命名(比如route_method、route_path),既避免冲突,又能清晰表达用途。

3. 可以像为类动态添加属性一样为函数动态添加属性吗?

当然可以!在Python里函数也是一等对象,和类实例一样支持动态添加属性。比如你直接写:

def test():
    pass

test.my_attr = "hello world"
print(test.my_attr)  # 会输出 hello world

完全合法。你提供的装饰器代码里,就是在wrapper这个函数对象上动态添加了__method__和__route__属性,这是Python装饰器里很常见的技巧,用来给被装饰的函数附加额外的元信息。

内容的提问来源于stack exchange,提问作者Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:39:06