【问题标题】:Programmatically / Dynamically concatenate parameters to an object to access data以编程方式/动态将参数连接到对象以访问数据
【发布时间】:2022-01-21 20:57:47
【问题描述】:

有可能做这样的事情吗?

class child:
    def __init__(self):
        self.figure = "Square"
        self.color = "Green"

bot = child()
bot_parameters = ['color', 'figure'] 

[print(bot.i) for i in bot_parameters] #Attribute Error from the print function.

我知道我可以使用__dict__ 访问参数值,但我想知道是否可以连接参数以编程/动态方式获取值。

【问题讨论】:

  • 您也可以按照question 中的建议使用getattr()
  • 目前还不清楚您期望达到的目标。确实没有定义的size 的值应该是多少? 连接参数以编程方式/动态获取值 不清楚您的意思是什么
  • 例如我可以编写代码: print(bot.figure) print(bot.color) 但我的问题是它是否可以做类似的事情:for parameter in ['figure', 'color ']: 打印(bot.parameter)

标签: python oop dynamic properties


【解决方案1】:

您可以一起使用内置的vars()getattr() 函数并像这样动态检索类实例的属性:

class Child:
    def __init__(self):
        self.figure = "Square"
        self.color = "Green"

bot = Child()

print([getattr(bot, attrname) for attrname in vars(bot)])  # -> ['Square', 'Green']

可以也只是硬编码['figure', 'color'],但这不是“动态”的,并且必须在更改类属性时进行更新。

【讨论】:

  • dot dict 不会得到类似的结果吗? bot.__dict__?
  • @ybressler_simon:在这种情况下,“是”。 vars() 更通用,适用于类实例以外的对象。同样在这种情况下,它的打字更少,更好地传达了 IMO 的意图。
  • 公平!将在我的当前工作中为vars() 寻找用例:)
  • @ybressler_simon:还要注意__dict__ 中除了属性之外还有其他内容(您必须以某种方式跳过或过滤掉)。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多