У меня есть этот код, который рассчитывает расстояние между двумя координатами. Обе функции находятся в одном классе.
Однако как я могу вызвать функцию 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)
...
Ответы:
Поскольку это функции-члены, вызовите его как функцию-член в экземпляре
self
.источник
Это не работает , потому что
distToPoint
находится внутри вашего класса, так что вам нужно префикс с именем класса , если вы хотите , чтобы обратиться к нему, как это:classname.distToPoint(self, p)
. Вы не должны делать это так, хотя. Лучший способ сделать это состоит в ссылку к методу непосредственно через экземпляр класса (который является первым аргументом метода класса), например , так:self.distToPoint(p)
.источник
classname.distToPoint(self, p)
: когда вы определяете подкласс, который переопределяетdistToPoint
, но должен вызывать оригинал. Если вы попытаетесь вызватьself.distToPoint(p)
как обычно в этом случае, вы в конечном итоге вызовете метод, который вы только что определили, и попадете в бесконечную рекурсию. Если не внутри класса, есть также только одна ситуация, в которой вы бы использовалиclassname.distToPoint(obj, p)
вместоobj.distToPoint(p)
: если obj может быть экземпляром подкласса, но вам нужно вызвать исходныйdistToPoint
определенный (продолжение)classname
вместо перегруженной версии в подклассе - но учтите , что это очень Hacky и не должно быть сделано вообще без очень уважительной причины. Обратите внимание, что вы нарушаете полиморфизм подтипа, когда вызываете метод явно через класс (в обоих приведенных выше примерах вы специально хотите это сделать). Короче говоря: вы должны вызывать метод только через класс, когда вам нужно обойти полиморфизм подтипа по какой-либо [веской] причине. Если метод не был переопределен, оба пути одинаковы, но ониself.distToPoint(p)
короче и более читабельны, (продолжение)@classmethod
перед методом, и после этого вы больше не получите instance (self
) в качестве первого аргумента - вместо этого вы получаете класс, поэтому вы должны назвать первый аргумент, например.cls
вместо. После этого вы можете вызывать метод класса либо как,obj.distToPoint(p)
либоclassname.distToPoint(p)
(обратите внимание на отсутствиеobj
). Вы все еще должны, вероятно, использовать (продолжение)obj.distToPoint(p)
тем не менее, если у вас в руках только соответствующий экземпляр, если - опять же - у вас нет [веских] причин обойти полиморфизм подтипа, поскольку метод класса мог бы быть переопределен и в подклассе в целом. Конечно, если у вас нет соответствующего экземпляра, вы должны непременно вызвать метод класса напрямую через класс.