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

しかし、これはコードを壊しました。への呼び出しがinterpSegment5 ではなく 6 つの属性を渡すようになったようです。誰かがなぜこれが起こるのか説明できますか? これを行うための最も Pythonistic な方法は何でしょうか?

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 に答える