Python中属性使用的疑问:仅通过设置属性编程的意义何在
拆解你给出的代码及相关疑问
先搞懂这段代码到底在做什么
逐行解析如下:
class Object(object): pass
定义了一个空的新式类,没有任何预设属性和方法。
obj = Object
注意这里不是创建类的实例(不是obj = Object()),而是把Object这个类本身赋值给了obj变量,所以obj现在就是那个空类的直接引用。
obj.a = lambda: None obj.d = lambda: dict
给obj(也就是Object类)添加两个类属性:
a是一个无参数的lambda函数,调用它会返回Noned是一个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
相关产品推荐
相关产品推荐

