Python:如何引用实例名称?

时间:2012-08-26 03:11:43

标签: python class instance

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

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 个答案:

答案 0 :(得分:6)

如果您的意思是如何从分配给hand1的实例中获取self.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"

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

最重要的是,如果你想要一些名字,需要决定如何处理这个名字。您需要编写自己的代码,为其提供名称,并使用您自己的代码来检索其名称。

答案 1 :(得分: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

答案 2 :(得分:0)

foo = Foo()表示变量foo只指向Foo()返回的对象,此处没有名称的概念。

答案 3 :(得分:0)

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

e.g。

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

    def insty(self):
        self.hands['hand1'] = Hand()
        self.hands['hand2'] = Hand()