【问题标题】:Is it possible to initialize a Python subclass by calling a function that returns an instance of its superclass?是否可以通过调用返回其超类实例的函数来初始化 Python 子类?
【发布时间】:2017-04-24 23:25:19
【问题描述】:

我正在尝试创建一个继承numpy.ndarray 的类,但我想使用返回ndarray 的函数对其进行初始化。具体来说,我想使用方便的numpy.genfromtxt() 函数从 CSV 文件生成ndarray。例如(我知道这段代码没有做我想做的事):

class MyClass(numpy.ndarray):
    def __init__(self, other_parameter):
        self = numpy.genfromtxt(filename, delimiter=',')
        self.other_param = other_parameter

关键是我想通过添加其他功能/属性来稍微扩展ndarray,而不会丢失与ndarray 的接口。我知道我可以将一个类中的属性拼凑在一起,其中一个是ndarray。是否可以使用不是super().__init__() 的构造函数(在我的类定义__init__() 中)扩展它?

我已经为其他几种语言找到了这类事情的答案,但没有找到 Python。我以前也想使用类似的 init 函数,但从未找到如何做到这一点。

【问题讨论】:

  • 你正在寻找的是调用super() - 看看this post
  • @RobertSeaman: super() 不会有帮助,因为numpy.genfromtxt 不是numpy.ndarray 构造方法。 numpy.genfromtxt 返回一个新数组,而不是初始化一个未初始化的数组。
  • numpy.ndarray 的子类化非常重要。请参阅docs
  • 你能做的最好的就是复制genfromtxt返回的数组;你不能让genfromtxt 直接初始化你的MyClass 对象。
  • 不管怎样,如果这就是你想要的全部,继承似乎有点矫枉过正。

标签: python class numpy initialization


【解决方案1】:

这个答案的功劳主要属于juanpa.arrivillaga 上面的评论。答案是this section of the link 提供。来自whole doc page 的其余信息有助于全面理解它。

简短的回答是在自定义类定义中使用__new__() 构造函数(我还不知道的标准Python)和“视图转换”,这是一种特殊的ndarray 功能。

【讨论】:

    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2016-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多