标题:我可以让超类返回对“实际类型”的引用吗?
基本上我有一个不可变的类,它是“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"
现在一个解决方案是将函数简单地复制粘贴到每个子类,但是我能以更好的方式执行此操作吗?那不会多次复制同一个函数吗?
答案 0 :(得分:4)
self
具有您需要的类型,因此您可以使用它。而不是
return Anomaly(p)
写
return type(self)(p)
或者,您可以在Anomaly
中将初始化类方法定义为
@classmethod
def from_float(cls, p):
return cls(p)
并将其用作
return self.from_float(p)
如果您需要一些非平凡的构造函数,这可能很有用。
顺便说一下,
__new__
实施似乎没有任何用途ModulateFullCircle
中{li>,p
后% (2 * pi)
保证为正。
醇>