gpt4 book ai didi

python - 将生成器函数子类化是否可能且可取?

转载 作者:太空宇宙 更新时间:2023-11-03 12:17:42 24 4
gpt4 key购买 nike

我经常使用返回特定类的生成器。我想要做的是生成生成器类的子类,以便我可以在其上使用适合生成该类实例的生成器的方法。例如,我想做的一件事是有一个方法返回一个过滤基本生成器的生成器。

我想做这样的事情:

class Clothes(object):
def __init__(self, generator):
self.generator = generator

def get_red(self):
return (c for c in self.generator if c.color=="red")

def get_hats(self):
return (c for c in self.generator if c.headgear)

我想作为衣服集合的衣服类。我不对集合进行子类化的原因是我很少想按原样使用整个衣服集合,通常只需要进一步过滤即可。但是,我经常需要经过筛选的各种衣服系列。如果可能的话,我希望 Clothes 本身就是一个生成器,因为这就是我打算使用它的方式,但是在尝试子类化 types.GeneratorType 时出现错误。

最佳答案

types.GeneratorType 

定义为:

def _g():
yield 1
GeneratorType = type(_g())

如您所见,它不是常规的

现在,是什么让发电机与众不同?不多。要使用生成器协议(protocol),所有要做的就是实现迭代器协议(protocol)。有一个很好的捷径:当您的 __iter__ 是一个生成器时,您可以免费获得 next()。这正是 collections.Iterable 的定义方式:

class Iterable(metaclass=ABCMeta):

@abstractmethod
def __iter__(self):
while False:
yield None

@classmethod
def __subclasshook__(cls, C):
if cls is Iterable:
if any("__iter__" in B.__dict__ for B in C.__mro__):
return True
return NotImplemented

因此,只需使用它来构建您的生成器即可。

关于python - 将生成器函数子类化是否可能且可取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10361956/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com