Python中的继承示例

Python中的继承示例,python,inheritance,Python,Inheritance,我不清楚如何提出这个问题。如果我这样做了,我可能会更接近一个解决方案。。我需要一些关于继承的见解 我想创建float的自定义子类型。但是我希望这个子类型的实例在执行任何普通的浮点方法之前重新评估它的值。。。在本例中,应将其值乘以全局因子: class FactorFloat(float): # I don't think I want to do this: ## def __new__(self, value): ## return float.__

我不清楚如何提出这个问题。如果我这样做了,我可能会更接近一个解决方案。。我需要一些关于继承的见解

我想创建float的自定义子类型。但是我希望这个子类型的实例在执行任何普通的浮点方法之前重新评估它的值。。。在本例中,应将其值乘以全局因子:

class FactorFloat(float):
    # I don't think I want to do this:
    ##    def __new__(self, value):
    ##        return float.__new__(self, value)
    def __init__(self, value):
        float.__init__(self, value)
    # Something important is missing..
    # I want to do something with global FACTOR
    # when any float method is called.

f = FactorFloat(3.)
FACTOR = 10.
print f   # 30.0
print f-1 # 29.0
FACTOR = 2.
print f   # 6.0
print f-1 # 5.0

这只是一个经过消毒的例子,我想我的观点得到了理解。如果需要的话,我会发布一个更复杂的真实问题。

你想要做的其实很难。我不知道有哪种python软件将float或int等类型子类化,然后对其进行数学运算。我认为也许有一种更好的方法可以实现您想要实现的目标,而不必使用float的子类。你应该研究其他选择。

你想要做的其实很难。我不知道有哪种python软件将float或int等类型子类化,然后对其进行数学运算。我认为也许有一种更好的方法可以实现您想要实现的目标,而不必使用float的子类。您应该研究备选方案。

这里有两种方法可以让您的测试用例通过

def __str__(self):
    return str(FACTOR*self)
def __sub__(self, other):
    return self*FACTOR-other
显然,您还必须实现uuu添加uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


话虽如此,您的用例是什么?这似乎是一件很奇怪的事情

这里有两种方法可以让您的测试用例通过

def __str__(self):
    return str(FACTOR*self)
def __sub__(self, other):
    return self*FACTOR-other
class FactorFloat(float):
    def _factor_scale(f):
        def wrapper(self, *args, **kwargs):
            scaled = float.__mul__(self, FACTOR)
            result = f(scaled, *args, **kwargs)
            # if you want to return FactorFloats when possible:
            if isinstance(result, float):
                result = type(self)(result/FACTOR)
            return result
        return wrapper

    def __repr__(self):
        return '%s(%s)' % (type(self).__name__, float.__repr__(self))

    __str__ = _factor_scale(float.__str__)
    __mul__ = _factor_scale(float.__mul__)
    __div__ = _factor_scale(float.__div__)
    __add__ = _factor_scale(float.__add__)
    __sub__ = _factor_scale(float.__sub__)


f = FactorFloat(3.)
FACTOR = 10.
print f   # 30.0
print f-1 # 29.0
FACTOR = 2.
print f   # 6.0
print f-1 # 5.0
print repr(f)
显然,您还必须实现uuu添加uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

话虽如此,您的用例是什么?这似乎是一件奇怪的事情

class FactorFloat(float):
    def _factor_scale(f):
        def wrapper(self, *args, **kwargs):
            scaled = float.__mul__(self, FACTOR)
            result = f(scaled, *args, **kwargs)
            # if you want to return FactorFloats when possible:
            if isinstance(result, float):
                result = type(self)(result/FACTOR)
            return result
        return wrapper

    def __repr__(self):
        return '%s(%s)' % (type(self).__name__, float.__repr__(self))

    __str__ = _factor_scale(float.__str__)
    __mul__ = _factor_scale(float.__mul__)
    __div__ = _factor_scale(float.__div__)
    __add__ = _factor_scale(float.__add__)
    __sub__ = _factor_scale(float.__sub__)


f = FactorFloat(3.)
FACTOR = 10.
print f   # 30.0
print f-1 # 29.0
FACTOR = 2.
print f   # 6.0
print f-1 # 5.0
print repr(f)
用于:

编辑:

回应评论中的问题;使用类装饰器使事情变得更加通用和自动化。我不会在dirbaseclass上循环,而是显式地列出我希望包装的方法。在下面的示例中,我将它们列在类变量_scale_方法中

用于:

编辑:

回应评论中的问题;使用类装饰器使事情变得更加通用和自动化。我不会在dirbaseclass上循环,而是显式地列出我希望包装的方法。在下面的示例中,我将它们列在类变量_scale_方法中


我的用例是使用一些全局查找值的多轴插值。例如,我想将空气密度定义为一个简单的类似浮子的变量,它取决于全球压力和温度。然而,我还想互换地使用温度和/或压力无关的密度的实际浮子,例如钢。我希望避免实现add、mul等,但这似乎是不可避免的。。可能比发布这个问题更容易。我的用例是使用一些全局查找值的多轴插值。例如,我想将空气密度定义为一个简单的类似浮子的变量,它取决于全球压力和温度。然而,我还想互换地使用温度和/或压力无关的密度的实际浮子,例如钢。我希望避免实现add、mul等,但这似乎是不可避免的。。可能比发布这个问题更容易…谢谢。好奇的是,有没有一种方法可以在dirfloat上循环,而不是单独定义uuu mul uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?我这样问是因为我可能想在numpy数组而不是float上尝试一下。谢谢。好奇的是,有没有一种方法可以在dirfloat上循环,而不是单独定义uuu mul uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?我之所以这么问,是因为我可能想在numpy数组而不是float上尝试一下。