获取属性函数问题(Python 3)

0 投票
2 回答
932 浏览
提问于 2025-04-17 12:50

我在一个Python脚本中写了以下代码:

setattr(stringRESULTS, "b", b)

结果出现了以下错误:

AttributeError: 'str' object has no attribute 'b'

有人能告诉我这里的问题是什么吗?

2 个回答

0

因为str是一个比较基础的类型,所以你不能随便给它添加属性。你可能需要用dict(字典)或者创建一个str的子类:

class StringResult(str):
    pass

这样做应该能达到你想要的效果:

my_string_result = StringResult("spam_and_eggs")
my_string_result.b = b

编辑:

如果你想按照DSM的建议,修改一个变量的属性,而这个变量的名字和stringRESULTS的值是一样的,那么你可以这样做:

locals()[stringRESULTS].b = b

请注意,这个操作非常危险,如果不小心可能会对你的应用造成各种麻烦。

3

别这么做。引用了伟大的 Greg Hewgill 的话,

“如果你发现自己在用引号括起来的名字来指代变量,通常有更好的方法可以完成你想做的事情。”

[这里你是用字符串变量来表示名字,但问题本质上是一样的。] 或者像 S. Lott 在同一讨论中提到的:

“90%的情况下,你应该使用字典。剩下的10%情况下,你需要完全停止你正在做的事情。”

如果你是用字符串变量 stringRESULTS 来指向某个对象 fred,并想要用 setattr 来设置它,那么你想要操作的这些对象必须已经存在于某个地方,而 字典 是存储它们的自然数据结构。实际上,根据你的使用场景,你甚至可以直接用字典的键值对来代替属性。

换句话说,我猜测你想做的事情可能看起来像这样:

d[stringRESULTS].b = b

或者

d[stringRESULTS]["b"] = b

这取决于我是否想要处理一个对象实例,或者字典是否就足够了。

(顺便说一下,关注 python-3.x 标签的人相对较少。通常加上简单的 'python' 标签会更容易引起关注。)

撰写回答