python - 在Python中,有没有一种方法可以自动将从父类继承的运算符的派生类操作结果转换为该派生类?

标签 python inheritance casting operator-overloading operators

假设我从具有各种运算符的父类创建了一个自定义类(+-*/ 等)已定义,我想保持这些运算符的工作方式不变。但是,在不重写运算符的情况下,它们的返回值是父类类型。有没有一种方便的方法可以自动将运算符结果转换为我的派生类类型?

这是一个示例 - MySeries 是一个基于 Pandas 的 Series 类的类。

import pandas as pd

class MySeries(pd.Series):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

如果我从中创建一些实例,它们的类型将为 MySeries,这很好。

s1 = MySeries([1,2,3])
s2 = MySeries([4,5,6])

type(s1)
>>> __main__.MySeries

但是当我执行像+这样的操作时,返回值变成父类:

type(s1+s2)
>>> pandas.core.series.Series

我希望type(s1+s2)可以是MySeries类型。我知道一个愚蠢的方法是覆盖例如__add__() 方法:

class MySeries(pd.Series):
    def __add__(self, other):
        return self.__class__(super().__add__(self, other))

但是对所有运算符(operator)做同样的事情是相当乏味的。

有没有更优雅的方法来做到这一点?

最佳答案

这似乎可以解决问题:

class MySeries(pd.Series):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    @property
    def _constructor(self):
        return MySeries

为了找到这一点,我使用调试器单步执行加法算术调用,以找到新值的创建位置。它最终为此调用了 pd.Series._constructor。

关于python - 在Python中,有没有一种方法可以自动将从父类继承的运算符的派生类操作结果转换为该派生类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63322507/

相关文章:

python - 将自定义函数应用于 numpy 中的 2 行或更多行(或列)

python - 在 ModelFormSet 中包含 editable=false 字段

c++ - 抽象类和继承 C++

C++ 库 : application inserts a class in inheritance hierarchy

c++ - static_cast 从基析构函数到指向派生类的指针的安全性

python - 在具有 O(1) 复杂性的列表中查找/检查项目的大多数 Pythonic 方法?

python 2.6 : piping bash commands containing python variables(inside python script)

inheritance - 在集合中混合共享同一接口(interface)的不同枚举

c - 乘以无符号字符时溢出?

sql - Hive 时间戳查询