用子类型初始化父类中的对象

费利彭

我编写了一个父类,在其中定义了所有子类都应具有的一些函数(例如__mul __,__ truediv__等)。这些函数在执行后应保留子类的类型。

这里有一些代码来解释我的意思:

class Magnet():
    
    def __init__(self, length, strength):
        
        self.length = length
        self.strength = strength
        
        return
    
    def __mul__(self, other):

        if np.isscalar(other):
            return Magnet(self.length, self.strength * other)

        else:
            return NotImplemented
        
class Quadrupole(Magnet):
    
    def __init__(self, length, strength, name):
        
        super().__init__(length, strength)
        
        self.name = name
        
        return

现在,如果我这样做:

Quad1 = Quadrupole(2, 10, 'Q1')
Quad2 = Quad1 * 2

然后Quad1的类型为'__main __。Quadrupole',Quad2的类型为'__main __。Magnet'。

我想知道如何做到这一点,以便保留孩子的类型,而不将其重铸为父类型。一种解决方案是在子类中重新定义这些功能并进行更改

        if np.isscalar(other):
            return Magnet(self.length, self.strength * other)

        if np.isscalar(other):
            return Quadrupole(self.length, self.strength * other)

但是进行继承的主要原因是不复制粘贴代码。也许像super()一样,但是向下或类类型的占位符...

感谢您的帮助。

采用的解决方案

使用

return type(self)(self.length, self.strength * other)

魅力。因为我忘了在Magnet .__ init __()中添加“ name”参数(我的原始代码确实这样做,但是在简化示例时弄乱了),所以会引发错误。

我在这里也发现了相同的问题:在__add__运算符中返回相同子类的对象

百里香

解决方案1

您可以使用获取类型type(self)从中创建一个新对象。

def __mul__(self, other):
    if np.isscalar(other):
        return type(self)(self.length, self.strength * other)
    raise NotImplemented

(也提出NotImplemented而不是返回它。)

现在使用您的代码将导致:

    return type(self)(self.length, self.strength * other)
TypeError: __init__() missing 1 required positional argument: 'name'

这将需要Quadrupole具有的默认参数name

class Quadrupole(Magnet):
    def __init__(self, length, strength, name='unknown'):
        super().__init__(length, strength)
        self.name = name

而且您的代码很高兴,但您可能不满意。其原因是,你现在失去了对信息name的的Quadrupole类。

解决方案2

您将返回该类的新实例,有时这不是必需的,并且您可以更改旧类。这会将您的代码简化为:

def __mul__(self, other):
    if np.isscalar(other):
        self.strength *= other.strength
        return self
    raise NotImplemented

这会改变您的旧实例。

解决方案3

解决方案1的主要问题是您丢失了信息,因为您正在创建新的类。现在可能的替代方法是只复制该类。不幸的是,复制一个类并不总是那么简单。

基于这个SO问题,deepcopy在这种情况下,使用可能会有效,但是如果您具有复杂的类结构,则可能必须实现__copy__以获得所需的内容。

def __mul__(self, other):
    if np.isscalar(other):
        class_copy = deepcopy(self)
        class_copy.strength *= other
        return class_copy
    raise NotImplemented

可以选择提供一种__copy__方法。对于提供的代码段,这不是必需的,但是在更复杂的情况下,则有必要。

def __copy__(self):
    return Quadrupole(self.length, self.strength, self.name)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

对象工厂设计以初始化父类或子类对象

来自分类Dev

在父类中使用的子类中初始化属性

来自分类Dev

用父类初始化子类

来自分类Dev

在子类中初始化超类对象

来自分类Dev

用初始化的父对象创建一个子类对象

来自分类Dev

如何访问子类中的变量而不在getter的父类中对其进行初始化

来自分类Dev

从子类__init __()中初始化父类是否可以接受?

来自分类Dev

自动初始化父类和子类中的成员变量

来自分类Dev

使用子类中该类的实例初始化父类的成员

来自分类Dev

用基类对象C ++初始化子类?

来自分类Dev

是否可以从子类更新在超类中初始化的对象?

来自分类Dev

如何使用子对象访问在父类中初始化的变量?

来自分类Dev

子类和超类中的重复初始化

来自分类Dev

在子类中初始化超类数组(java)

来自分类Dev

用类构造函数初始化类对象的指针?

来自分类Dev

初始化在模板化父类中定义的结构

来自分类Dev

用类的现有对象初始化对象

来自分类Dev

在python中创建无法初始化但其子类可初始化的类的最佳方法

来自分类Dev

初始化类的对象时,“无法使用集合初始化程序初始化类型”

来自分类Dev

用记录类型初始化打字稿中的空对象

来自分类Dev

为什么孙子类的父级不处理祖父母类的初始化?

来自分类Dev

如何从子类的构造函数初始化父类的私有成员

来自分类Dev

为什么孙子类的父级不处理祖父母类的初始化?

来自分类Dev

用参数初始化另一个类构造函数中的对象

来自分类Dev

Python类继承:如何使用不在父类中的值初始化子类

来自分类Dev

使用python中父类的魔术方法__init__初始化子类

来自分类Dev

如何在Java中抽象父级的子类中初始化受保护的最终变量?

来自分类Dev

如何从作为参数传递的类中初始化对象

来自分类Dev

如何改善C#中的类对象初始化?

Related 相关文章

  1. 1

    对象工厂设计以初始化父类或子类对象

  2. 2

    在父类中使用的子类中初始化属性

  3. 3

    用父类初始化子类

  4. 4

    在子类中初始化超类对象

  5. 5

    用初始化的父对象创建一个子类对象

  6. 6

    如何访问子类中的变量而不在getter的父类中对其进行初始化

  7. 7

    从子类__init __()中初始化父类是否可以接受?

  8. 8

    自动初始化父类和子类中的成员变量

  9. 9

    使用子类中该类的实例初始化父类的成员

  10. 10

    用基类对象C ++初始化子类?

  11. 11

    是否可以从子类更新在超类中初始化的对象?

  12. 12

    如何使用子对象访问在父类中初始化的变量?

  13. 13

    子类和超类中的重复初始化

  14. 14

    在子类中初始化超类数组(java)

  15. 15

    用类构造函数初始化类对象的指针?

  16. 16

    初始化在模板化父类中定义的结构

  17. 17

    用类的现有对象初始化对象

  18. 18

    在python中创建无法初始化但其子类可初始化的类的最佳方法

  19. 19

    初始化类的对象时,“无法使用集合初始化程序初始化类型”

  20. 20

    用记录类型初始化打字稿中的空对象

  21. 21

    为什么孙子类的父级不处理祖父母类的初始化?

  22. 22

    如何从子类的构造函数初始化父类的私有成员

  23. 23

    为什么孙子类的父级不处理祖父母类的初始化?

  24. 24

    用参数初始化另一个类构造函数中的对象

  25. 25

    Python类继承:如何使用不在父类中的值初始化子类

  26. 26

    使用python中父类的魔术方法__init__初始化子类

  27. 27

    如何在Java中抽象父级的子类中初始化受保护的最终变量?

  28. 28

    如何从作为参数传递的类中初始化对象

  29. 29

    如何改善C#中的类对象初始化?

热门标签

归档