作为类属性使用的函数的微妙意外行为



我有一段代码,当我改变一个属性并把它变成class-attribute时,它被破坏了,我想知道为什么。

我从

开始
def linInterp(x1, x2, y1, y2, x):
    return y1 + (x - x1) * (y2 - y1) / (x2 - x1)
class Inter1DLineal(object):
    def __init__(self):
        self.interpSegment = linInterp
if __name__ == "__main__":
    inter = Inter1DLineal()
    print(inter.interpSegment(0.2, 0.6, 0, 1, 0.4))

可以正常工作。我知道我可以在Inter1DLineal中实现interpSegment作为适当的方法,例如

@classmethod
def interpSegment(cls, *args, **kwargs):
    return linInterp(*args, **kwargs)

但是我认为我可以使用函数类型的属性

让我吃惊的是接下来发生的事情。我决定,因为interpSegment对所有实例都是通用的,我应该把它作为一个类属性。
def linInterp(x1, x2, y1, y2, x):
    return y1 + (x - x1) * (y2 - y1) / (x2 - x1)
class Inter1DLineal(object):
    interpSegment = linInterp
    def __init__(self):
        pass
if __name__ == "__main__":
    inter = Inter1DLineal()
    print(inter.interpSegment(0.2, 0.6, 0, 1, 0.4))

但是这破坏了代码。似乎对interpSegment的调用现在正在传递6个属性,而不是5个。有人能解释一下为什么会这样吗?最符合Pythonistic的做法是什么?

您将inter传递为第一个参数,即self参数。因此,本质上,在"__main__"代码中,您传递的内容如下:

interpSegment(inter, 0.2, 0.6, 0, 1, 0.4)

你应该这样称呼它:

Inter1DLineal.interpSegment(0.2, 0.6, 0, 1, 0.4)

然而,让我也说明一下,你首先做的是interpSegment__init__中或作为一个单独的方法是更好的方法。

相关内容

  • 没有找到相关文章

最新更新