如何在类内调用函数?

402 投票
3 回答
783709 浏览
提问于 2025-04-16 15:27

我有一段代码,用来计算两个坐标之间的距离。这两个函数都在同一个类里面。

但是,我该怎么在函数 isNear 里面调用 distToPoint 这个函数呢?

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

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

3 个回答

0

在这个问题中,distToPoint()isNear() 都是实例方法,也就是说,它们的第一个参数通常是一个实例的引用,通常叫做 self。当你直接从实例调用一个实例方法时,这个引用会自动传递,所以

self.distToPoint(p)

这样是可以工作的。


如果你想从子类调用一个被重写的父类方法,那么就应该使用 super()。在下面的例子中,greet() 方法在 ParentChild 类中都有定义。如果你想调用 Parentgreet() 方法,正确的方式是通过 super(),也就是 super().greet()。当然,你也可以通过类名来调用,比如 Parent.greet(self),但这样硬编码有很多缺点,比如灵活性差,不能正确使用方法解析顺序等等,所以更推荐使用 super()

class Parent:
    def greet(self):
        print("greetings from Parent!")
        
    def parent_printer(self):
        print("this is parent printer")
        
class Child(Parent):
    def greet(self, parent=False):
        if parent:
            super().greet()                 # Parent's greet is called
        else:
            print("greetings from Child!")
        
    def printer(self, greet=True):
        if greet:
            self.greet()                    # Child's greet is called
        else:
            self.parent_printer()           # Parent's parent_printer is inherited
        
        
c = Child()
c.greet()                # greetings from Child!
c.greet(parent=True)     # greetings from Parent!
c.printer()              # greetings from Child!
c.printer(greet=False)   # this is parent printer
82

这样做不行,因为 distToPoint 是你类里面的一个方法,所以如果你想用到它,就得在前面加上类名,像这样:classname.distToPoint(self, p)。不过这样做并不是很好。更好的做法是通过类的实例直接调用这个方法(这个实例就是类方法的第一个参数),像这样:self.distToPoint(p)

629

因为这些是成员函数,所以要在实例上调用它们,也就是用 self 来调用。

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

撰写回答