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

时间:2014-03-20 08:19:25

标签: python class-attributes

当我更改属性并使其成为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))

工作正常。我知道我可以在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.有人可以解释为什么会发生这种情况吗?最狡猾的做法是什么?

1 个答案:

答案 0 :(得分: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__中{{1}}所处的位置或者作为一种方法本身就是更好的方法。