2012-08-26 114 views
3

我使用下面的代码收集实例:Python:如何引用实例名称?

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

+1

你是什么意思的“实例名称”?你认为每个实例的“名称”是什么? – BrenBarn

+0

“hand1”和“hand2”就是我所指的......也许是错误的。我是一个新手...要温柔! – dwstein

+2

'hand in hand.instances:hand.do_something()'有什么问题? – qiao

回答

6

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

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

现在这个手的名字应该是什么?您将同一只手分配给“bob”和“larry”,因此无法拥有唯一的唯一名称。

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

你当然也可以通过将它们分配属性提供手中的“名”:

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

。 。 。但是这些名称不是特殊的或以任何方式“自动”的。

底线是,如果你想要某个名字,需要决定如何处理这个名字。你需要编写你自己的代码,给它它的名字,和你自己的代码来检索它的名字。

+0

好的。想我终于明白了..谢谢! – dwstein

0

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

0

foo.__dict__将具有“hand1”和“hand2”键(等等)。但是你可能会以这种错误的方式去做。如果名称很重要,则应在Foo(或某处)将它们用作明确的索引。

例如

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

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

谢谢!如果我动态创建实例,这会工作吗?即我不知道有多少实例正在创建, – dwstein

+0

是的,但您应该尝试阅读更多关于['dict']的信息(http://docs.python.org/library/stdtypes.html#dict)类型。 –

+0

会做!谢谢。 – dwstein

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 
+0

嗨!感谢您的答复。但是,链接往往会加班。你也许可以添加代码的相关部分?谢谢。 – lrnzcig

+0

@imzcig,修好了! –