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

Python 中为函数添加自定义属性的正确实现方式

问题解答

完全可以这么做,Python里的函数属于一等对象,本身就支持像类实例一样直接添加自定义属性,语法和你给类实例加属性的写法完全没有区别。

你可以直接给你的几个爬虫函数加属性,示例代码如下:

# 直接给函数挂载属性
scrapper_english.language = "English"
scrapper_english.test_status = "FullyTested"

scrapper_german.language = "German
scrapper_german.test_status = "PartiallyTested"

scrapper_spanish.language = "Spanish"
scrapper_spanish.test_status = "NotTested"

之后你在任何用到这些函数的时候,直接通过函数名加属性名就能读取对应信息,不需要再额外查字典:

# 调用示例
if scrapper_english.test_status == "FullyTested":
    res = scrapper_english()

这种方案的优势

  • 不需要单独维护额外的映射字典,函数本身自带所有关联的元信息,代码逻辑更直观,不会出现函数和字典信息不同步的问题
  • 遍历同类型函数批量处理时,直接遍历函数列表就能读取所有属性,不需要同时维护函数列表和字典两份数据

注意事项

如果你的函数被装饰器修饰过,要确保装饰器使用了functools.wraps来保留原函数的元信息,否则你添加的属性会挂载到装饰器返回的包装函数上,可能出现属性读取异常的问题,正确的装饰器写法示例:

import functools

def common_decorator(func):
    @functools.wraps(func) # 必须加这行保留原函数元信息
    def wrapper(*args, **kwargs):
        # 装饰器逻辑
        return func(*args, **kwargs)
    return wrapper

@common_decorator
def scrapper_english():
    # 函数实现
    pass

如果你需要批量给所有函数加属性,可以直接写循环处理即可:

func_config = [
    (scrapper_english, "English", "FullyTested"),
    (scrapper_german, "German", "PartiallyTested"),
    (scrapper_spanish, "Spanish", "NotTested")
]

for func, lang, status in func_config:
    func.language = lang
    func.test_status = status

如果你的属性和函数本身关联度不高、不需要跟着函数传递,或者函数是第三方库提供的你没法直接修改,那继续用原来的字典存储方案更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:48:02