Sus*_*dal 5 python inheritance overriding iterable
假设我有一个基类:
class Base:
A = False
B = ''
C = ''
def __iter__(self):
yield 'a', self.A
yield 'b', self.B
yield 'c', self.C
Run Code Online (Sandbox Code Playgroud)
然后是一个从这个基派生的类:
class Data(Base):
D = ''
def __iter__(self):
yield 'd', self.D
Run Code Online (Sandbox Code Playgroud)
这当然只创建一个包含{ 'd': <value> }on的字典dict( Data() ),当数据类的实例转换为dict类型时;因为据我所知,派生类__iter__方法有效地覆盖了基类__iter__方法。
然后我尝试从派生类覆盖的方法中调用基类方法,就像我们在__init__()函数中所做的那样:
def __iter__(self):
super().__iter__()
yield 'd', self.D
Run Code Online (Sandbox Code Playgroud)
但是 IDE 将其标记为错误。为什么这不起作用?以及如何定义派生的 iter 方法来扩展已经存在的基类 iter 方法,以便我只需要为派生类中添加的变量添加 yield?是否在派生类 iter 方法中再次手动写出所有收益,这是目前我实现它的唯一解决方案?为什么?
class Data(Base):
D = ''
def __iter__(self):
yield 'a', self.A
yield 'b', self.B
yield 'c', self.C
yield 'd', self.D
Run Code Online (Sandbox Code Playgroud)
这super().__iter__()是行不通的,因为它是一个生成器,在这种情况下调用生成器是没有意义的。您想要做的是迭代该生成器返回的内容并从您的__iter__in 中产生它们Data:
蟒蛇2:
def __iter__(self):
for i in super().__iter__():
yield i
yield 'd', self.D
Run Code Online (Sandbox Code Playgroud)
但在 Python 3 中,这可以更简洁地写成:
def __iter__(self):
yield from super().__iter__()
yield 'd', self.D
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1300 次 |
| 最近记录: |