【问题标题】:Python: Using a variable dynamically to call a Dictionary Key in a Class instancePython:动态使用变量来调用类实例中的字典键
【发布时间】:2021-02-16 15:19:58
【问题描述】:

我正在尝试在 Student 类中创建一个函数来搜索动态创建的属性。我找不到使用 函数 export_rubric_inputs(self, rubric) 的参数来调用字典键的方法。请注意,该属性将是从 save_rubric_inputs 函数创建的字典。

我尝试了很多不同的方法,包括使用 getattr,但因为它是一本字典,所以它不起作用。

编辑:我想使用导入功能访问我作为字典存储的数据

代码:

#Example Dictionary
collector_card = {
  "name": "collector_card",
  1: "x",
  5: 3,
  7: "You are correct"
  }

*Metaclass: Makes a class iterable*
class IterRegistry(type):
  def __iter__(cls):
    return iter(cls._registry)

*Creates instances of students when imported from CSV File*
class Student(metaclass=IterRegistry):
  *Keeps Track of all instances of Class*
  _registry = []

 *Constructor*
  def __init__(self, name, student_id = 0):
    self._registry.append(self)
    self.student_id = student_id
    self.name = name

 *Takes inputs after created in Tkinter*
  def save_rubric_inputs(self, rubric):
    setattr(self, rubric["name"], rubric)  

  *What I am having trouble with*
  def export_rubric_inputs(self, rubric):
    self.rubric

# Creating a Single Instance for this example
dave = Student("Dave")
dave.save_rubric_inputs(collector_card)

dave.export_rubric_inputs(collector_card)

【问题讨论】:

  • 你想让export_rubric_inputs返回save_rubric_inputs中设置的属性吗?
  • 请展示您希望如何使用您的代码,例如通过包含代码 sn-p 以及该 sn-p 的预期输出。
  • @SaedSayedAhmed 是的,完全正确
  • * 有什么用?另外,你能提供一个minimal reproducible example吗?
  • @AMC 这是我第一次在这里提出问题,而# 正在做奇怪的事情。我确实在最后添加了一个小例子。下面的答案确实有效,我只是不明白为什么,因为它似乎引用了字典的一部分。我把完整的评论放在下面

标签: python function class


【解决方案1】:

所以,如果目的是获取你设置的属性,那么你实际上需要在export_rubric_inputs中做如下操作:

getattr(self, rubric["name"])

如果您仍希望self.rubric 工作,您必须将save_rubric_inputs 中的setattr 行更改为setattr(self, "rubric", rubric)

您当前的代码将属性创建为rubric["name"] 中的任何值,但不是rubric,因此没有称为rubric 的属性(除非rubric["name"] 中的值是"rubric")。

【讨论】:

  • 谢谢你;虽然我不知道为什么它确实有效,因为我的理解是它现在引用字典中的“名称”元素,但给出整个字典?至于您的最后一条评论,是的,我在输入中创建了一个名称元素来制作它,这样我就可以使用输入函数将它添加到实例中。再次感谢您的帮助
  • 因此,在setattr 中,您传递了三件事,您要添加属性的对象(在您的情况下为self),该属性的名称(rubric["name"])和值 (rubric)。名称和值不必相关。 值的名称不影响属性的名称
  • 啊,谢谢。我的大脑在那里度过了一个糟糕的时刻。感谢帮助
猜你喜欢
  • 2022-06-11
  • 2018-11-11
  • 2011-08-26
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2019-02-01
  • 2017-07-28
  • 1970-01-01
相关资源
最近更新 更多