4

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

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 的每个实例的实例名称?

4

4 回答 4

7

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

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

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

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

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

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

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

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

于 2012-08-26T03:18:42.450 回答
1

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

于 2012-08-26T03:16:16.703 回答
1

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

但事实证明,在 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
于 2016-10-12T19:15:56.787 回答
0

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

例如

class Foo():
    def __init__(self):
        self.hands = {}

    def insty(self):
        self.hands['hand1'] = Hand()
        self.hands['hand2'] = Hand()
于 2012-08-26T03:16:39.337 回答