2012-09-24 11 views
1

我想我只是用我的代碼走錯了路。我希望得到一些pythonic答案。Python:在被調用時評估列表中的變量,而不是指向對象

我想能夠產生[object.name,對象]的列表。然後將使用一個方法在列表中搜索object.name,然後返回該對象。用戶還應該能夠更改object.name下面的代碼設置類。

class a(): 
    def __init__(self, name): 
     self.name = name 

class b(): 
    def __init__(self): 
     self.graph = [] 
    def make_a(self, name): 
     new_a = a(name) 
     self.graph.append([new_a.name, new_a]) 

用戶隨後就進入:

obj_B = b() 
obj_B.make_a('jack') 
obj_B.graph 
[['jack', <a instance at 0x02FB2260>]] 

用戶應該然後能夠做到:

obj_B.graph[0][1].name = 'jill' 

隨後的obj_B.graph輸出應該再是:

[['jill', <a instance at 0x02FB2260>]] 

在寫作時我意識到我應該使用一個字典,然後編寫一個方法來創建新的和刪除舊的字典鍵。如果有人有更好的想法,我會很高興看到他們。

+7

歡迎來到Stack Overflow!你絕對應該使用一本字典(沒有太多的話要說) –

+2

精神上與'obj .__ dict__'非常相似...... – nneonneo

+0

無論你使用什麼方法,將它封裝在類b中。不要讓用戶必須知道它是如何組織的。提供一個rename()方法或類似的東西。然後,您可以根據需要輕鬆更改您的實施。 –

回答

0

正如@大衛·羅賓遜指出,這聽起來像你試圖重新實現dict的功能。但是,要解決原始問題,您遇到的問題是字符串是不可變的。當你寫obj_B.graph[0][1].name = 'jill',你改變aname的情況下舉行的參考,但不是在obj_B.graph參考。考慮以下幾點:

>>> a = 'hello' 
>>> b = a # b is now a reference to the same str object as a 
>>> id(a) 
4305179104 
>>> id(b) 
4305179104 
>>> b is a 
True 
>>> a = 'goodbye' # create a new str object in the heap, and change the reference belonging to a 
>>> id(a) 
4305179152 # not the same object as before! 
>>> id(b) 
4305179104 # b is the same 
>>> b is a 
False 

比較這對可變類型,這是就地修改:

>>> a = [1,2,3] 
>>> b = a 
>>> a.append(4) # we are not reassigning a, just modifying the list object it points to 
>>> print a 
[1, 2, 3, 4] 
>>> print b 
[1, 2, 3, 4] 
>>> b is a 
True 

這適用的引用是否在命名空間中的變量或條目在列表中。

解決您原來的問題是使name的方法,並與呼叫接入它,就像這樣:

class A(object): 
    def __init__(self, name): 
     self._name = name 
    def set_name(self, name): 
     self._name = name 
    def get_name(self): 
     return self._name 

>>> l = [] 
>>> a = A('jack') 
>>> l.append((a.get_name, a)) 
>>> l[0][1].set_name('jill') 
>>> l[0][0]() 
'jill' 

或者,你可以給類__str__方法,並用它來返回名稱。這樣,你只需要一個條目列表:

class A(object): 
    def __init__(self, name): 
     self.name = name 
    def __str__(self): 
     return self.name 

>>> l = [] 
>>> l.append(A('jack')) 
>>> str(l[0]) 
'jack' 
>>> l[0].name = 'jill' 
>>> str(l[0]) 
'jill' 

PS,如果你正在使用Python 2.x中,所有你寫的應該object繼承的類。也就是說,你的classdefs應該閱讀class a(object):等等,這是必要的你的類是新型,這是highly desirable。舊式類(不從object繼承)僅僅是爲了向後兼容。在Python 3中,這不再是必要的,因爲所有的類都是新式的。

相關問題