Python:如何引用实例名?

Python:如何引用实例名?,python,class,instance,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

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

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

foo=foo()
意味着变量
foo
只指向由
foo()
返回的对象,这里没有名称的概念。

foo.\uu dict\uu
将具有“
hand1
”和“
hand2
”键(以及其他键)。但你可能走错了方向。如果名称很重要,则应将其用作
Foo
(或其他地方)中的显式索引

e、 g


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

h = Hand()
self.bob = h
self.larry = h
那只手的“名字”应该是什么?你给“鲍勃”和“拉里”分配了同一只手,所以它不可能有一个唯一的名字

如果你想为每只手取一个名字,你需要告诉那只手你想给它取什么名字。您必须修改手代码,以便将名称传递给构造函数,然后使用
Hand(“某些名称”)
创建手

当然,您可以通过在手上指定属性来为手命名:

self.hand1 = Hand()
self.hand1.name = "hand 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

“实例名”是什么意思?你认为每个实例的“名称”是什么?我指的是“hand1”和“hand2”。。。也许是错误的。我是个新手。。。温柔点!hand-in-hand.instances:hand.do_something()?@dwstein-instance-name只是一个指向对象的变量,例如,如果你有,
foo=foo()
,然后
foo1=foo
,那么
foo
foo1
都指向
foo()
,那么你将如何命名这个实例呢?所以前几天我遇到了这个人。。。为什么我仅仅通过看他就不能确定他的名字?你说人们有时有不止一个名字是什么意思?谢谢!如果我动态创建实例,这是否有效?i、 e.我不知道创建了多少实例,是的,但您应该尝试阅读有关该类型的更多信息。您应该忘记
\uuu dict\uu
存在。这是一个实现细节,并不意味着要被戳破。的确,但它很可能是OP最初问题的少数几个答案之一。嗨!谢谢你的回复。然而,链接往往会随着时间的推移而中断。您是否也可以添加代码的相关部分?谢谢。@imzcig,修好了!
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