python - 继承重写的运算符时返回与调用相同的类型
问题描述
想象一下 Python 中的这种情况:
class A:
def __init__(self, v):
self.val = v
def __add__(self, b):
return A(self.val + b.val)
class B(A):
def __init__(self, v):
super().__init__(v)
很明显,B__add__
从其父 A 继承了运算符覆盖。
如果我有这些对象的一些实例,并执行一些添加:
foo = A(3)
bar = B(4)
baz = B(5)
alp = foo + foo
bet = foo + bar
gam = bar + baz
alp
具有A
预期的类型。bet
也确实如此,这可能不太出人意料,但并不奇怪。
gam
但是有 type A
,这很烦人,因为我们添加了两个实例B
来获取它。
我的问题是:如何才能做到gam
有类型B
?是否需要__add__
显式覆盖 B 上的每个运算符(例如 )以将结果super().__add__(b)
转换为 B 的类型?或者有没有更聪明、更清洁的方法让它发挥作用?
谢谢你。
解决方案
而不是调用A(...)
call type(self)(...)
。将type(self)
返回当前对象的类。
推荐阅读
- sed - sed 替换正则表达式正确的语法
- snowflake-cloud-data-platform - 来自 S3(COPY)的雪花负载数据与来自外部表的负载
- vb.net - 为 VSTO 插件编写异常
- c - C Program that Removes Comments from a String
- python - 在 Python 中为短语 (bigram,n-gram) 创建词云
- javascript - Vue firebase:无法检索用户数据。不明确的
- python - 如何在不隐式更改列类型的情况下更新 DataFrame?
- python - 检查单词是否对照字典。如果可以通过从字典单词中删除 1 个字符来创建单词,则单词仍在字典中
- angular - 如何解决角度条件下的逻辑错误
- c++ - 在 C++ 中是否有可以访问计时器功能(即启动和结束计时器)的函数?