Вопрос-Ответ

How can I call a function within a class?

Как я могу вызвать функцию внутри класса?

У меня есть этот код, который вычисляет расстояние между двумя координатами. Обе функции находятся в одном классе.

Однако, как мне вызвать функцию 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)
...
Переведено автоматически
Ответ 1

Поскольку это функции-члены, вызовите ее как функцию-член в экземпляре, self.

def isNear(self, p):
self.distToPoint(p)
...
Ответ 2

Это не работает, потому что distToPoint находится внутри вашего класса, поэтому вам нужно добавить к нему префикс classname, если вы хотите обратиться к нему, вот так: classname.distToPoint(self, p). Однако вам не следует делать это подобным образом. Лучший способ сделать это - обратиться к методу напрямую через экземпляр класса (который является первым аргументом метода класса), вот так: self.distToPoint(p).

Ответ 3

В OP distToPoint() и isNear() оба являются методами экземпляра и, как таковые, оба принимают ссылку на экземпляр (обычно именованный self) в качестве своего первого аргумента. Когда метод экземпляра вызывается непосредственно из экземпляра, ссылка передается неявно, поэтому

self.distToPoint(p)

работает.


Если вы хотите вызвать переопределенный родительский метод из дочернего класса, то super() можно / нужно использовать. В следующем примере greet() метод определен как в Parent, так и в Child классах, и если вы хотите вызвать Parent's 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
2023-09-08 17:30 python function class