2012-08-26 140 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,修好了! –