私はこのコードを持っています:
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__
。たぶん、有界関数についてのすべては、実行時にそれを持っているのではなく、構文糖衣であるべきでした。しかし、反対に、構文糖衣は実際にはコンテンツに依存するべきではありません。どこかでトレードオフが必要だと思います。