python - super().__init__ 覆盖属性

标签 python python-3.x inheritance keras super

我正在子类初始化器中设置一个属性,该属性似乎被调用 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

我假设wrappers.Wrapper中的某些内容会覆盖该属性,但内置包装器子类Bidirectional具有几乎相同的父类(super class) init 调用(我在实现中基本上遵循了该子类的模式)

class Bidirectional(Wrapper):

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

没有表现出这种行为

In [6]: bidir = wrappers.Bidirectional(GRU(64, stateful=True))

In [7]: bidir.stateful
Out[7]: True

我无法理解这个问题。我在 Python 3.6 下使用 Keras 2.1.3。

附注

我已经尝试将 super().__init__(layer, **kwargs) 替换为 super(Dummy, self).__init__(layer, **kwargs) 在我的子类中无济于事。

最佳答案

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

我认为的代码是 latest release在其自己的 __init__start 处调用 super().__init__:

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

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

关于python - super().__init__ 覆盖属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471040/

相关文章:

Python 正则表达式语句未返回正确的结果

python - 检查特定元素列表的更好方法 - python

python - 为每个文件名生成新的 MD5 哈希值

python - 查找一个文件文本中同一行中的项目组合及其频率

python - 使用 Python WebTest 进行功能测试

c++ - 嵌入式 Python 值冲突

python - 从字符串列表中选择合适的选项

c++ - 排序函数,它采用指向接口(interface)类的指针 vector

python - 如何继承Django变量?