我有這樣的代碼:隱式調用的對象結合實例
class LFSeq: # lazy infinite sequence with new elements from func
def __init__(self, func):
self.evaluated = []
self.func = func
class __iter__:
def __init__(self, seq):
self.index = 0
self.seq = seq
def next(self):
if self.index >= len(self.seq.evaluated):
self.seq.evaluated += [self.seq.func()]
self.index += 1
return self.seq.evaluated[self.index - 1]
而且我明確地想要那個LFSeq.__iter__
界變得像任何其它用戶定義的函數本來的LFSeq
一個實例。
雖然這種方式不起作用,因爲只有用戶定義的函數是有界的而不是類。
當我介紹一個函數裝飾像
def bound(f):
def dummy(*args, **kwargs):
return f(*args, **kwargs)
return dummy
然後我可以裝點通過它__iter__
和它的作品:
...
@bound
class __iter__:
...
這在某種程度上但是感覺哈克和不一致。有沒有其他方法?應該是這樣嗎?
我想是的,因爲否則LFSeq.__iter__
和LFSeq(None).__iter__
不會再是同一個對象(即類對象)。也許關於有界函數的整個事情應該是語法糖,而不是在運行時使用它。但是,另一方面,語法糖不應該依賴於內容。我想在某個地方必須有一些權衡。