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
相关产品推荐
相关产品推荐

