2012-10-22 58 views
1

如何刪除此對象中的__size屬性?如何在__init__上創建__len__函數?

class Object(): 
    def __init__(self, size): 
     self.__size = size 

    def __len__(self): 
     return self.__size 

init函數如何創建len函數? Lambda函數? PS:在我的真實情況下,我在這個len函數中做了一些計算,但是在實例化之後,結果總是相同的(例如像元組)。將此結果保存在沒有任何隱藏屬性的函數中可能會很好。

+1

你能更具體一點嗎?僞私有屬性往往是記憶對象中數據的最佳方式,但您的問題有點模糊,無法給出更好的建議。 –

+4

,因爲它是現在,沒有什麼是錯的,但我會叫'_size'成員。 [顯式優於隱式。](http://www.python.org/dev/peps/pep-0020/) – dav1d

+1

簡而言之:您不應該爲刪除該屬性而努力。這樣更好。 – jsbueno

回答

3

我不建議這一點,但你可以用一個簡單的lambda函數

class Object(): 
    def __init__(self, size): 
     self.__len__ = lambda: size 


>>> len(Object(3)) 
3 

爲什麼我不會推薦這都是用Python的禪subsummed的原因:顯式優於隱式。簡單勝於複雜。

如果您使用的是實例變量,那麼它是顯式的,您有更好的堆棧跟蹤錯誤,您可以使用函數__len__功能和代碼更容易理解,當閱讀和更新它。

+0

你爲什麼不推薦這個? – recursive

+1

它在99.9%的情況下在不添加功能的情況下引入開銷。 –

+1

@recursive顯式比隱式更好。簡單勝於複雜。如果你正在使用一個實例變量,那麼它是顯式的,你有更好的錯誤堆棧跟蹤,你可以在你的__len__函數中使用doctests,並且在閱讀和更新代碼時它更易於理解。 –

2

由於無法讓__len__成爲要通過len()使用的實例屬性,因此必須在類中定義它。但由於沒有其他限制,您可以定義一個實例屬性__len__以便您的名稱空間不受污染。

class MyObject(object): 
    def __init__(self, size): 
     self.__len__ = lambda: size 
    def __len__(self): 
     return self.__len__() 

這看起來令人困惑(因爲這可能是froned),但它的工作原理。

它的工作原理,因爲該類屬性__len__(),作爲def -ed函數,調用實例屬性__len__(),這是從__init__()拉姆達。

在展示了什麼是可能的,我不會推薦它,因爲它可能會非常混亂。

您的原始解決方案要好得多。

相關問題