【问题标题】:Python: how to refer to an instance name?Python:如何引用实例名称?
【发布时间】:2012-08-26 03:11:43
【问题描述】:

我正在使用以下代码收集实例:

class Hand():
    instances = []
    def __init__(self):
        Hand.instances.append(self)
        self.value = 5

    def do_something(self, a):
        self.value = self.value * a

class Foo():
    def __init__(self):
        pass

    def insty(self):
        self.hand1 = Hand()
        self.hand2 = Hand()


foo = Foo()
foo.insty()
print Hand.instances

for hand in Hand.instances:
    print "how do I print the instance name?"

最后一行只是一种学习如何访问实例名称的方法,因此我可以按顺序在每个实例上调用“do_something”方法。

如何访问 Hand 的每个实例的实例名称?

【问题讨论】:

  • “实例名称”是什么意思?您认为每个实例的“名称”是什么?
  • "hand1" 和 "hand2" 是我所指的......也许是错误的。我是新手……要温柔!
  • for hand in Hand.instances: hand.do_something() 有什么问题?
  • @dwstein 实例名称只是一个指向一个对象的变量,例如,如果你有,foo=Foo(),然后是foo1=foo,那么foofoo1 都指向@ 987654327@,那你怎么命名实例呢?
  • 所以我前几天遇到了这个人……我怎么不能只看他的名字就知道他的名字?你是什​​么意思意思人们有时有多个名字?

标签: python class instance


【解决方案1】:

如果您的意思是如何从分配给self.hand1 的实例中获取hand1,答案是您不能。当您执行self.hand1 = Hand() 时,您告诉 Foo 对象它有一个 Hand,但 Hand 对象不知道它已分配给 Foo。你可以这样做:

h = Hand()
self.bob = h
self.larry = h

现在那只手的“名字”应该是什么?您将同一只手分配给“bob”和“larry”,所以它不可能有一个唯一的名称。

如果你想为每只手起一个名字,你需要告诉这只手你想给它起什么名字。您必须修改您的 Hand 代码以允许您将名称传递给构造函数,然后使用 Hand("some name") 创建 Hand。

您当然可以通过为它们分配属性来给它们“命名”:

self.hand1 = Hand()
self.hand1.name = "hand 1"

。 . .但这些名称在任何方面都不是特殊的或“自动的”。

底线是,如果您希望某物有名称,需要决定如何处理该名称。您需要编写自己的代码来为其命名,并编写自己的代码来检索其名称。

【讨论】:

    【解决方案2】:

    foo = Foo()表示变量foo只是指向Foo()返回的对象,这里没有名字的概念。

    【讨论】:

      【解决方案3】:

      我不知道这是否能解决您的问题。我需要获取实例名称才能进行清晰的错误报告。我所到之处,人们都说“变量没有名字!名字只是指向事物的指针!”

      但事实证明,在 python 中获取实例名称非常简单。 我是这样做的:

      import gc
      def instance_names(self):
          referrers = gc.get_referrers(self)
          result = []
          dict_of_things = {}
          for item in referrers:
              if isinstance(item, dict):
                  dict_of_things = item
          for k, v in dict_of_things.items():
              if v == self:
                  result.append(k)
          if not result:
              result = ['unnamed instance']
          return result
      

      【讨论】:

      • 嗨!感谢您的答复。但是,链接往往会随着时间的推移而中断。您是否也可以添加代码的相关部分?谢谢。
      • @imzcig,已修复!
      【解决方案4】:

      foo.__dict__ 将具有“hand1”和“hand2”键(等等)。但你可能会以错误的方式解决这个问题。如果名称很重要,您应该将它们用作Foo(或某处)中的显式索引。

      例如

      class Foo():
          def __init__(self):
              self.hands = {}
      
          def insty(self):
              self.hands['hand1'] = Hand()
              self.hands['hand2'] = Hand()
      

      【讨论】:

      • 谢谢!如果我动态创建实例,这会起作用吗?即我不知道正在创建多少个实例,
      • 是的,但您应该尝试阅读有关dict 类型的更多信息。
      • 您应该忘记__dict__ 的存在。这是一个实现细节,并不意味着被戳。
      • 确实如此,但这可能是对 OP 原始问题的极少数答案之一。
      猜你喜欢
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多