我有一段代码,当我改变一个属性并把它变成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__
中或作为一个单独的方法是更好的方法。