如何在类内调用函数?
我有一段代码,用来计算两个坐标之间的距离。这两个函数都在同一个类里面。
但是,我该怎么在函数 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()
方法在 Parent
和 Child
类中都有定义。如果你想调用 Parent
的 greet()
方法,正确的方式是通过 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)
...