2013-09-21 66 views
0

是否有可能給'Nonetype' object分配屬性來告訴Python在被調用時該怎麼做?給'NoneType'對象屬性

這裏是我的問題:

我有一個類,用作庫存儲的myOtherObject實例。在添加實例之前,它首先檢查該密鑰是否已經存在,然後將數據追加到分配給該密鑰的實例,而不是覆蓋它。

class MyClass: 

    def __init__(self): 
     self.myLibrary = {} 

    def __setitem__(self, key, item): 
     if key not in self.myLibrary: 
      self.myLibrary[key] = myOtherObject(name=item[0], attr1=[item[1]], attr2=[item[2]]) 
     else: 
      self.myLibrary[key].attr1.append(item[1]) 
      self.myLibrary[key].attr2.append(item[2]) 

    def __getitem__(self, key): 
     if key in self.myLibrary: 
      return self.myLibrary[key] 
     else: 
      return None #??? 

從庫中檢索數據時,應該檢查是否存在關鍵太強了,如果鍵只存在返回分配的對象。

>>> o = MyClass() 
>>> o['key1'] = ['name1','b','c'] 
>>> o['key1'] 
<__main__.myOtherObject instance at 0x05509B48> 
>>> o['key1'].attr1 
'b' 
>>> o['key2'] 
>>> o['key2'].attr1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'attr1' 

我能以某種方式告訴Python中沒有做任何事情,當屬性attr1attr2'NoneType' object稱爲只返回None:調用該對象的屬性時,也能正常工作或致電只是對象,但不是?

回答

1

這可能是錯誤的問題。在__getitem__方法中要做的適當的(pythonic)事情是提高KeyError例外。然後你在呼叫者中處理這個異常,或者在可以處理它的適當地方處理這個異常。

0

使用getattr

>>> o = None 
>>> print getattr(o, "attr1", None) 
None 
-1

是否有可能將屬性分配給 'Nonetype' 對象

>>> o = None 
>>> o.foo = 1 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'foo' 
>>> setattr(o,'foo',1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'foo' 
>>> getattr(o,'foo') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'NoneType' object has no attribute 'foo' 

添加實例之前,它首先檢查是否該鍵al準備就緒,然後將數據附加到分配給該鍵的實例,而不是覆蓋它。

這是一個典型的用例的defaultdict:

import collections 
d = collections.defaultdict(list) 
d['foo'].append(1) 
print d #=> defaultdict(<type 'list'>, {'foo': [1]}) 

從庫中檢索數據時,應該檢查是否鍵存在過,並且如果該鍵只存在返回分配的對象。這可以正常工作或僅調用對象,但不能在調用該對象的屬性時使用:

OK。當密鑰不存在時你想要發生什麼?

我可以通過某種方式告訴Python不要做任何事情,只要從'NoneType'對象調用屬性attr1和attr2時返回None就可以嗎?

這是什麼意思?如果您嘗試訪問不存在的屬性,則會發生異常,如上所述。解決辦法是處理例外情況,並返回None;但它會是太多更好讓異常傳播,因爲None不是有效的輸入。


總之,你想要的一切都可以用defaultdict來實現。可能不要創建自己的班級。

+0

我試過defaultdict。問題是我的myOtherObject有超過10個屬性和幾個方法 - 在這裏它只是簡化。所以爲了使它與deafultdict一起工作,我需要至少三個級別的每個鍵的列表。這太令人困惑了,所以我想要屬性被命名的對象。 – Banana

+0

基本上我希望能夠通過o ['key']。attr檢索和賦值(並使用方法),但只有當o ['key']存在時。也許我會被迫在使用/分配它之前檢查密鑰是否存在於我的主類之外。 – Banana

+0

@ totoro2絕對沒有任何一個暗示你需要多層次的列表。你的問題並沒有真正揭示你想要解決什麼問題,但我幾乎肯定你正在採取錯誤的方針。 – Marcin

相關問題