【问题标题】:Initialize instance with mother class attributes使用母类属性初始化实例
【发布时间】:2016-07-26 15:01:47
【问题描述】:

我正在处理我使用 fit.open() 从 astropy 库中读取的拟合文件。我得到一个 hdu(标头数据单元),它是 astropy.io.fits.hdu.image.PrimaryHDU 的一个实例。

现在,对于一个特定的项目,我想通过编写特定的方法来处理这个 hdu 中的数据。我想,一个很好的方法是编写我自己的类,这将是 PrimaryHDU 的子类。我的新对象将具有 PrimaryHDU 实例的所有属性和方法,以及我将编写的属性和方法。但我无法让它正常工作。我的新对象如何获取父对象的所有属性和方法?我最接近的是使用以下代码(例如,使用一个新方法调用“减法”):

from astropy.io.fits.hdu.image import PrimaryHDU

class MyHDU(PrimaryHDU):

    def __init__(self, hdu):
        PrimaryHDU.__init__(self, data=hdu.data, header=hdu.header)

    def subtract(self, val):
        self.data = self.data - val

没关系,但是我可以看到我的新对象没有将所有属性设置为与原始对象 (hdu) 相同的值....当我查看我的代码时,这似乎很正常实际上......但是如何使用父对象的所有属性初始化我的新对象?我是否正确让我的新类从 PrimaryHDU 类继承? 谢谢

【问题讨论】:

  • 你使用的是 Python 2 还是 Python 3?

标签: python class inheritance


【解决方案1】:

如何使用父对象的所有属性初始化我的新对象?

你不能。您不是从实例(即对象)继承,而是从类继承。

你应该做的是传递所有你需要的参数来初始化父类和子类。在子类的__init__方法中调用super().__init__(父类的__init__方法)然后初始化子类的其余部分:

from astropy.io.fits.hdu.image import PrimaryHDU

class MyHDU(PrimaryHDU):

    def __init__(self, args_to_init_PrimaryHDU_obj, hdu):
        super().__init__(args_to_init_PrimaryHDU_obj)
        # if using Python 2 the above line should be
        # super(PrimaryHDU, self).__init__(args_to_init_PrimaryHDU_obj)
        self.data = hdu.data
        self.header = hdu.header

    def subtract(self, val):
        self.data = self.data - val

【讨论】:

  • 当然,好吧,这是有道理的。我确实混淆了对象和类。谢谢。但是是:super(PrimaryHDU, self).__init__(args_to_init_PrimaryHDU_obj) 不同于:PrimaryHDU.__init__(args_to_init_PrimaryHDU_obj)?
  • @samR 这取决于您使用的 Python 版本,如果使用 Python 2 则取决于 PrimaryHDU 是旧式类还是新式类。
猜你喜欢
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 1970-01-01
  • 2018-01-07
相关资源
最近更新 更多