gpt4 book ai didi

python - 我可以让父类(super class)返回对 "actual type"的引用吗?

转载 作者:行者123 更新时间:2023-11-28 22:40:18 26 4
gpt4 key购买 nike

正如标题:我可以让父类(super class)返回对“实际类型”的引用吗?

基本上我有一个immutable 类,它是“float”的子类型。这个类如果进一步子类型化以区分几个不同的角度。

现在,所有这些子类型的方法大部分都是相同的。但是,如果我在类上执行函数,则应保留其类型。 (但我无法修改该值,因此我需要返回一份副本)。代码:

class Anomaly(float):
"""
Anomaly class
"""
def __new__(cls, val):
return super().__new__(cls, val)

def ModulateFullCircle(self):
"""
Modulates value to [0, 2*pi) interval
:return: Modulated anomaly
"""
p = self % (2*pi)
if p < 0:
p += 2*pi
return Anomaly(p)

def ModulateBidirectional(self):
"""
Modulates value to (-pi, pi] interval
:return: Modulated anomaly
"""
p = self % (2*pi)
if p > pi:
p -= 2*pi
return Anomaly(p)


class TrueAnomaly(Anomaly):
"""
True Anomaly class
"""

def __new__(cls, val):
super().__new__(cls, val)

a = TrueAnomaly(8.2*pi)
b = a.ModulateBidirectional()
#now b should still be of type "TrueAnomaly"

现在的解决方案是将函数简单地复制粘贴到每个子类中,但我能以更好的方式做到这一点吗?那不会多次复制相同的函数吗?

最佳答案

self 在你的方法中有你需要的类型,所以你可以直接使用它。而不是

return Anomaly(p)

return type(self)(p)

或者,您可以在 Anomaly 中定义一个初始化类方法作为

@classmethod
def from_float(cls, p):
return cls(p)

并将其用作

return self.from_float(p)

如果您需要一些重要的构造函数,这可能会有用。

顺便说一下,

  1. 您的__new__ 实现似乎没有任何作用
  2. ModulateFullCircle中,p保证在% (2 * pi)之后为正。

关于python - 我可以让父类(super class)返回对 "actual type"的引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33827785/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com