类中的Python调用函数


242

我有这段代码可以计算两个坐标之间的距离。这两个函数都在同一类中。

但是,如何在函数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
试试:self.distToPoint(p)
momeara 2011

if isNear和distToPoint使用不同的参数怎么办?然后我们如何调用类内部的distToPoint?任何人都可以为我解释一下。
Raghavendra Gupta,

Answers:


394

由于这些是成员函数,因此在实例上将其称为成员函数self

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

2
但是要小心self.foo()将使用方法解析顺序,该顺序可能会解析为其他类中的函数。
弗朗西斯·戴维

如果我们不使用自我会怎样?直接调用distToPoint(p)?
马隆·阿比库恩

3
@Marlon Abeykoon的“自我”论点将不见了
Pitipaty

1
if isNear和distToPoint使用不同的参数怎么办?然后我们如何调用类内部的distToPoint?任何人都可以为我解释一下。
Raghavendra Gupta,

46

那是行不通的,因为distToPoint它在您的类内部,因此如果要引用它,则需要在类名前面加上前缀,例如:classname.distToPoint(self, p)。但是,您不应该那样做。更好的方法是直接通过类实例(这是类方法的第一个参数)引用该方法,如下所示:self.distToPoint(p)


@Aleski。如果这是一种通用方法(在所有实例中都是通用的,并且在该方法中没有引用任何实例特定的变量),那么您能否解释一下为什么不应该使用classname.distToPoint(self,p)?
Yugmorf '18 -10-10

2
@Yugmorf:在只有一种情况下应该使用classname.distToPoint(self, p):当您定义一个覆盖distToPoint,但需要调用原始类的子类时。如果您self.distToPoint(p)在这种情况下尝试像平常一样进行调用,则最终将调用刚定义的方法,并进入无限递归。如果不在类内,则只有一种情况可以使用classname.distToPoint(obj, p)而不是obj.distToPoint(p):如果obj可能是子类的实例,但是您需要调用原始distToPoint定义的(续)
Aleksi Torhamo

1
classname而不是在子类中重写版本-但请注意,这是非常哈克,应该不是一般做没有非常充足的理由。请注意,当您通过类显式调用方法时,会破坏子类型多态性(在以上两个示例中,您都特别这样做)。简而言之:您仅出于某些[良好]原因而需要避开子类型多态性时,才应通过类显式调用方法。如果尚未重写该方法,则这两种方法是相同的,但self.distToPoint(p)会更短且更具可读性,(续)
Aleksi Torhamo

因此您绝对应该仍然使用它。现在,来解决您的问题的细节:如果您的方法不使用任何实例变量,那么应该改为使用类方法吗?您可以通过@classmethod在方法前添加来进行创建,然后再不再将实例(self)作为第一个参数-而是获得类,因此应将第一个参数命名为。cls代替。之后,您可以像obj.distToPoint(p)或一样调用类方法classname.distToPoint(p)(请注意缺少obj)。您可能应该使用(续)
Aleksi Torhamo

obj.distToPoint(p)但是,如果您手边只有一个相关的实例,除非-再次-您有[很好]的理由来规避子类型多态性,因为通常也可以在子类中覆盖该类方法。当然,如果没有可用的相关实例,则应通过直接调用类方法。
Aleksi Torhamo '18 -10-10
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.