如何继承python生成器并覆盖__iter__

海耶

我想给母亲班打电话,但收到以下消息:

Traceback (most recent call last):
  File "***test.py", line 23, in <module>
    for i in daughter:
  File "***test.py", line 18, in __iter__
    for i in super(Mother, self):
TypeError: 'super' object is not iterable

我认为这只是语法上的问题,我尝试不使用任何方法(仅对象本身来调用super(母亲,自我)这里的代码:

class Mother(object):
    def __init__(self, upperBound):
        self.upperBound = upperBound

    def __iter__(self):
        for i in range (self.upperBound):
            yield i


class Daughter(Mother):
    def __init__(self, multiplier, upperBound):
        self.multiplier = multiplier
        super(Daughter, self).__init__(upperBound)

    def __iter__(self):
        for i in super(Mother, self): # Here
            yield i * self.multiplier


daughter = Daughter(2, 4)
for i in daughter:
    print i

这里只是一个例子,我的目的是读取文件并逐行产生。然后,子类生成器解析所有行(例如,从该行中列出...)。

马丁·彼得斯(Martijn Pieters)

返回的代理对象super()是不可迭代的,仅因为__iter__MRO中有一个方法。您需要显式查找此类方法,因为这只会引起搜索:

for i in super(Daughter, self).__iter__():
    yield i * self.multiplier

请注意,您需要super()当前类上使用,而不是在父类上使用

super()无法直接支持特殊方法,因为这些方法是由Python直接在类型上查找的,而不是实例。请参阅特殊方法查找新类

对于新型类,只有在对对象的类型(而不是在对象的实例字典中)进行定义的情况下,才能保证对特殊方法的隐式调用可以正常工作。

type(super(Daughter, self))super类型对象本身,它没有任何特殊方法。

演示:

>>> class Mother(object):
...     def __init__(self, upperBound):
...         self.upperBound = upperBound
...     def __iter__(self):
...         for i in range (self.upperBound):
...             yield i
...
>>> class Daughter(Mother):
...     def __init__(self, multiplier, upperBound):
...         self.multiplier = multiplier
...         super(Daughter, self).__init__(upperBound)
...     def __iter__(self):
...         for i in super(Daughter, self).__iter__():
...             yield i * self.multiplier
...
>>> daughter = Daughter(2, 4)
>>> for i in daughter:
...     print i
...
0
2
4
6

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章