我有这个代码:
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__:
...
然而,这感觉有点hacky和不一致。还有其他方法吗?应该是这样吗?
我猜是的,否则LFSeq.__iter__
就LFSeq(None).__iter__
不再是同一个对象(即类对象)。也许关于有界函数的全部内容应该是语法糖,而不是在运行时。但是另一方面,语法糖不应该真正依赖于内容。我想必须在某个地方进行一些权衡。