У меня есть этот код, который вычисляет расстояние между двумя координатами. Обе функции находятся в одном классе.
Однако, как мне вызвать функцию distToPoint в функции isNear?
classCoordinates: defdistToPoint(self, p): """ Use pythagoras to find distance (a^2 = b^2 + c^2) """ ...
defisNear(self, p): distToPoint(self, p) ...
Переведено автоматически
Ответ 1
Поскольку это функции-члены, вызовите ее как функцию-член в экземпляре, self.
defisNear(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() таких как гибкость, возможность корректного использования порядка разрешения методов и т.д.
classParent: defgreet(self): print("greetings from Parent!")
defparent_printer(self): print("this is parent printer")
classChild(Parent): defgreet(self, parent=False): if parent: super().greet() # Parent's greet is called else: print("greetings from Child!")
defprinter(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