hay*_*ayj 5 python inheritance generator
我想打电话给母班,但我得到这样的信息:
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
Run Code Online (Sandbox Code Playgroud)
我认为这只是语法,我试着在没有任何方法的情况下调用超级(母亲,自己),只是对象本身.这里的代码:
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
Run Code Online (Sandbox Code Playgroud)
这只是一个例子,我的目的是读取文件并逐行屈服.然后子类生成器解析所有行(例如,从行中生成一个列表...).
返回的代理对象super()是不可迭代的,因为__iter__MRO 中有一个方法。您需要明确查找此类方法,因为只有这样才会开始搜索:
for i in super(Daughter, self).__iter__():
yield i * self.multiplier
Run Code Online (Sandbox Code Playgroud)
请注意,您需要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
Run Code Online (Sandbox Code Playgroud)