0

当我更改属性并将其设为类属性时,我有一段代码被破坏,我很想了解原因。

所以,我从

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

没问题。我知道我可以在 中实现interpSegment为适当的方法Inter1DLineal,例如

@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 个。有人可以解释为什么会发生这种情况吗?这样做的最Python主义的方式是什么?

4

1 回答 1

1

好吧,您将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__或作为一种方法本身是一种更好的方法。

于 2014-03-20T08:37:45.090 回答