我正在使用以下代码收集实例:
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的每个实例的实例名称?
答案 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()