我可以让超类返回对“实际类型”的引用吗?

时间:2015-11-20 13:21:49

标签: python inheritance

标题:我可以让超类返回对“实际类型”的引用吗?

基本上我有一个不可变的类,它是“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"

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

1 个答案:

答案 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)

如果您需要一些非平凡的构造函数,这可能很有用。

顺便说一下,

  1. 您的__new__实施似乎没有任何用途
  2. ModulateFullCircle中{li>,p% (2 * pi)保证为正。