クラス内のPython呼び出し関数


242

2つの座標間の距離を計算するこのコードがあります。2つの関数はどちらも同じクラス内にあります。

しかし、関数distToPointで関数を呼び出すにはどうすればよいisNearですか?

class Coordinates:
    def distToPoint(self, p):
        """
        Use pythagoras to find distance
        (a^2 = b^2 + c^2)
        """
        ...

    def isNear(self, p):
        distToPoint(self, p)
        ...

41
try:self.distToPoint(p)
momeara

isNearとdistToPointが異なる引数をとっている場合はどうでしょうか。次に、クラス内にあるdistToPointをどのように呼び出すことができますか?だれでも説明してください。
Raghavendra Gupta

回答:


394

これらはメンバー関数なので、インスタンスのメンバー関数として呼び出しますself

def isNear(self, p):
    self.distToPoint(p)
    ...

2
ただし、self.foo()は異なるクラスの関数に解決される可能性があるメソッド解決順序を使用することに注意してください。
Francis Davey、2014年

自分を使わないとどうなりますか?そして、distToPoint(p)を直接呼び出しますか?
Marlon Abeykoon

3
@マーロン・アベイクーンの「自己」論は欠落するだろう
Pitipaty 2016年

1
isNearとdistToPointが異なる引数をとっている場合はどうでしょうか。次に、クラス内にあるdistToPointをどのように呼び出すことができますか?だれでも説明してください。
Raghavendra Gupta

46

distToPointはクラスの内部にあるため、機能しません。そのため、参照する場合は、クラス名をプレフィックスとして付ける必要がありますclassname.distToPoint(self, p)。ただし、そのようにすべきではありません。これを行うためのより良い方法は、次のように、クラスインスタンス(クラスメソッドの最初の引数)から直接メソッドを参照することですself.distToPoint(p)


@Aleski。ジェネリックメソッド(すべてのインスタンスに共通で、メソッドでインスタンス固有の変数が参照されていない)の場合、classname.distToPoint(self、p)を使用してはいけない理由を説明していただけませんか?
Yugmorf 2018年

2
@Yugmorf:使用すべき状況は1つだけありますclassname.distToPoint(self, p):をオーバーライドするサブクラスを定義しているがdistToPoint、オリジナルを呼び出す必要がある場合。self.distToPoint(p)その場合に通常のように呼び出そうとすると、定義しているメソッドを呼び出すことになり、無限再帰に入ります。クラス内にない場合、classname.distToPoint(obj, p)代わりに使用する状況も1つだけありますobj.distToPoint(p)distToPoint
。obj

1
classnameこれは非常にハックであるとすることなく、一般的に行われるべきではありませんのでご注意-の代わりにオーバーライドされたサブクラスでのバージョンの非常に良い理由。クラスを介してメソッドを明示的に呼び出すと、サブタイプのポリモーフィズムを解除することに注意してください(上記の両方の例では、それを明確にしたい考えています)。つまり、サブタイプのポリモーフィズムを回避する必要がある場合にのみ、クラスを介してメソッドを明示的に呼び出す必要があります。メソッドがオーバーライドされていない場合、2つの方法は同じですが、self.distToPoint(p)短くて読みやすくなります(続き)
Aleksi Torhamo

だからあなたは間違いなくそれを使うべきです さて、あなたの質問の詳細に行きます:あなたのメソッドがインスタンス変数を使用しない場合、多分それは代わりにクラスメソッドであるべきですか?@classmethodメソッドの前に追加することでそれらを作成し、その後self、最初の引数としてインスタンス()を取得しなくなります。代わりにクラスを取得するため、最初の引数に名前を付ける必要があります。cls代わりに。その後、obj.distToPoint(p)またはのようにクラスメソッドを呼び出すことができますclassname.distToPoint(p)(がないことに注意してくださいobj)。おそらくまだ使用する必要あります(続き)
Aleksi Torhamo 2018年

obj.distToPoint(p)ただし、関連するインスタンスを手に持っている場合は、サブメソッドのポリモーフィズムを回避する[正当な]理由がなければ、クラスメソッドもサブクラスでオーバーライドされる可能性があります。もちろん、関連するインスタンスがない場合は、クラスを介して直接classmethodを呼び出す必要があります。
Aleksi Torhamo 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.