2012-10-08 67 views
0

我有一個python對象,它在概念上允許通過迭代器和getter訪問一個充滿字符串的數組。但是,由於計算數組中每個元素的確切值非常昂貴,我正在考慮爲數組中每個插槽的內容返回一個代理對象,然後在實際需要時即時計算實際值。懶洋洋地提供一個字符串的值

也就是說,我想這樣寫:

bar = foo.get(10) # just returns a proxy 
baz = bar # increase proxy reference 
l = [baz] # actually increase proxy reference again. 
print baz # ooh, actually need the value. Calculate it only the fly. 
v = '%s' % bar # I need the value here again 
if bar is None: # I need the value here again 
    print 'x' 
if bar: # I need the value here again 
    print 'x' 
for i in bar: # I need the value here again 
    print i 

在C++中,我會嘗試超載對其操作...你知道嗎?

我明白,每一種情況下,我可以重載特定蟒蛇「神奇」的功能(如__str__print baz),但我不知道:

  • 這將實際覆蓋所有可能的usecases(是否有辦法來訪問的變量不使用蟒蛇神奇的功能)
  • 還有一個更通用的方法來做到這一點

回答

1

在Python會返回一個自定義類型涉及到的內容,並覆蓋__str__()方法來計算打印時的字符串表示形式。

class MyCustomType(object): 
    def __str__(self): 
     return "My string is really costly to produce" 

根據您的使用情況,您還在尋找在各個鉤Python提供:

  • 屬性自定義類的訪問可以掛與__getattr__方法,或者通過使用property
  • 訪問類似序列的類(列表,元組,字符串)中的單個項目可以使用__getitem__將映射類類掛鉤。

你必須決定,根據您的使用情況,你需要掛接到,此時它成爲不可避免的,你需要昂貴的計算是什麼。 Python可以讓你輕鬆地在對象的生命週期中鉤住幾乎所有的點。

+0

我很抱歉,但現在很明顯,這個問題還不夠清楚。我編輯過它。 – mathieu

+0

@mathieu:那麼你的問題一點都不清楚,你需要再用Python來玩。自定義類仍然是要走的路,魔術'__str__'掛鉤仍然是提供打印值的方式。因爲它是一個自定義類,所以您仍然可以通過您指定的API訪問實例上的其他數據。 –

相關問題