super().__ init__覆盖属性

时间:2018-01-26 23:33:30

标签: python python-3.x inheritance keras super

我在子类初始化程序中设置了一个属性,似乎被awk -F',' 'NR==FNR {a[$1]=$3 ;next} !($3 in a) {print }' OFS='\t' file1 file2 的调用覆盖了。

super().__init__

我会假设from keras.layers import GRU, wrappers class Dummy(wrappers.Wrapper): def __init__(self, layer, **kwargs): self.stateful = True print(self.stateful) super().__init__(layer, **kwargs) print(self.stateful) In [3]: dummy = Dummy(GRU(64, stateful=True)) True False In [4]: dummy.stateful Out[4]: False 中的某些内容覆盖了该属性,但内置的包装器子类Bidirectional具有几乎相同的超类init调用(我基本上遵循了我的实现中此子类的模式)< / p>

wrappers.Wrapper

没有证明这种行为

class Bidirectional(Wrapper):

    def __init__(self, layer, merge_mode='concat', weights=None, **kwargs):
        ...
        self.stateful = layer.stateful
        ...
        super(Bidirectional, self).__init__(layer, **kwargs)

我无法绕过这个。我在Python 3.6下使用Keras 2.1.3。

P.S。

我已经尝试用我的子类中的In [6]: bidir = wrappers.Bidirectional(GRU(64, stateful=True)) In [7]: bidir.stateful Out[7]: True 替换super().__init__(layer, **kwargs)无效。

1 个答案:

答案 0 :(得分:2)

您正在查看Bidirectional源代码的错误版本。从三天前开始,您所看到的版本似乎是this one。我相信该版本与您的代码有相同的错误。

我认为的代码是super().__init__的{​​{1}}来自__init__的{​​{1}} {/ 1}} {/ 1>}

def __init__(self, layer, merge_mode='concat', weights=None, **kwargs):
    super(Bidirectional, self).__init__(layer, **kwargs)
    ...

这样,它的行为发生在祖先构造函数的动作之后,它的self.stateful赋值会覆盖它的祖先。