【问题标题】:How to call an instance of a class without knowing the name beforehand如何在事先不知道名称的情况下调用类的实例
【发布时间】:2017-04-08 23:14:47
【问题描述】:

假设我有一个类的不同实例;

class Person(object):
    def __init__(self, id):
        self.id = id

Joe = Person('123')
Sarah = Person('321')

我现在的问题是,我如何能够在事先不知道名称的情况下使用其中一个实例,例如,我可以有一些请求名称甚至 ID 的东西。我如何将它与适当的对象相关联?假设输入了一个 id '123',我如何知道它属于 Joe 对象,然后动态使用该对象?如果该信息很有用,我正在运行 Python 3.6。

【问题讨论】:

  • 有很多方法,但这是严重的代码异味,从一开始就听起来像是糟糕的设计。但最简单的方法是将对象保存在 dict 中,将 id 映射到所需的 Person 对象...

标签: python python-3.x class


【解决方案1】:

当您学习计算机编程时,您可能会听到一个并非开玩笑的笑话,即只有三个重要的数字:0、1 和无穷大。换句话说,你可以一无所有或一物一物,但如果你可以拥有多个,你必须准备好处理任意数量的它们。

当你只能有零或一个东西时,把它放在一个变量中就可以了。但是当你可以拥有任意数量的东西时,这个解决方案很快就会变得笨拙。程序员青睐的解决方案是将对象放入容器中, 类似于列表或字典。

例如字典方式:

people = {"123": Person("123"), "321": Person("321")}

那么乔是people["123"]

实际上,您也希望将人名存储在对象中,否则您无法分辨它实际代表的是谁,因此您可以将其添加到您的 Person 类中。您还可以让对象在实例化时将 itself 添加到 master people dict:

people = {}

class Person(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name
        people[id] = self

joe = Person("123", "Joe")
sarah = Person("321", "Sarah")

现在,当您实例化对象时,它们会通过其 ID 自动添加到 people 字典中,您可以这样访问它们。 (您也可以按名称添加它们,假设名称是唯一的:如果 ID 和名称永远不会冲突,甚至可以添加到同一个字典中。)

注意“调用”在编程中有一个特定的含义:你调用一个函数。你没有在这里调用任何东西。

【讨论】:

  • 可以考虑将people 设为类变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-21
  • 2016-10-01
相关资源
最近更新 更多