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

Python中属性使用的疑问:仅通过设置属性编程的意义何在

拆解你给出的代码及相关疑问

先搞懂这段代码到底在做什么

逐行解析如下:

class Object(object):
    pass

定义了一个空的新式类,没有任何预设属性和方法。

obj = Object

注意这里不是创建类的实例(不是obj = Object()),而是把Object这个类本身赋值给了obj变量,所以obj现在就是那个空类的直接引用。

obj.a = lambda: None
obj.d = lambda: dict

给obj(也就是Object类)添加两个类属性:

  • a是一个无参数的lambda函数,调用它会返回None
  • d是一个lambda函数,调用它会返回Python内置的dict类
setattr(obj.d, 'dictionary', {4,3,5})
setattr(obj.a, 'somefield', 'somevalue')

这两行是给函数对象本身添加属性:

  • obj.d是那个返回dict的lambda函数,给它加了一个名为dictionary的属性,值是集合{4,3,5}(注意这是集合,不是字典,写法容易混淆)
  • obj.a是返回None的lambda函数,给它加了somefield属性,值是字符串'somevalue'

你的疑问解答

关于调用obj.a.somefield用print冗余

obj.a.somefield本身就是一个可以直接获取的值,print只是把它输出到控制台的操作。如果你需要把这个值拿来做其他逻辑(比如赋值给变量、拼接字符串、作为参数传入函数),完全不需要print,直接使用即可。比如:

value = obj.a.somefield
# 直接用value做后续操作,不需要print

仅通过设置属性编程的优势

这种动态给对象加属性的写法,是Python“一切皆对象”特性的体现,它的优势集中在特定场景:

  • 快速构建轻量级数据容器:临时需要存一组相关数据时,不想写完整的类定义(比如不用dataclass或普通类),用这种方式比字典更直观——用.访问属性而不是[key]。
  • 元编程与动态扩展:在运行时给类、函数动态添加标记或功能,比如装饰器里给函数加属性标记执行状态,或者框架里动态给类注入配置属性。
  • 适配特定框架/库的要求:有些第三方库会通过检查对象的属性来完成配置、路由等逻辑,这时候动态设置属性是必要的。

能不能把所有变量放对象类里写整个程序?

理论上可行,但绝对不推荐。这种写法会让代码完全失去结构,变量和逻辑混作一团,后期维护、调试、扩展都会变得极其困难。正常编程还是要遵循封装、模块化原则:用类的方法封装逻辑,用合理的属性定义存储状态,把相关功能组织在一起,而非随意给对象乱加属性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:15:42