Eu tenho esse código que calcula a distância entre duas coordenadas. As duas funções estão dentro da mesma classe.
No entanto, como chamo a função distToPoint
na função 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)
...
Respostas:
Uma vez que estas são funções de membro, chamá-lo como uma função membro na instância,
self
.fonte
Isso não funciona porque
distToPoint
está dentro de sua classe, então você precisa prefixo com o nome da classe, se você quiser se referir a ele, como este:classname.distToPoint(self, p)
. Você não deve fazer assim, no entanto. A melhor maneira do fazer é para referir o método directamente através da instância de classe (que é o primeiro argumento de um método de classe), assim:self.distToPoint(p)
.fonte
classname.distToPoint(self, p)
: quando você está definindo uma subclasse que substituidistToPoint
, mas precisa chamar o original. Se você tentasse ligarself.distToPoint(p)
normalmente, nesse caso, acabaria chamando o método que está definindo e entraria em uma recursão infinita. Se não estiver dentro de uma classe, também há apenas uma situação em que você usaria emclassname.distToPoint(obj, p)
vez deobj.distToPoint(p)
: se obj pode ser uma instância da subclasse, mas você precisa chamar o originaldistToPoint
definido (continuação)classname
vez da versão substituída na subclasse - mas nota que isso é muito hacky e não deve ser feito, em geral, sem muito boa razão. Observe que você quebra o polimorfismo de subtipo ao chamar um método explicitamente por meio de uma classe (nos dois exemplos acima, você deseja fazer isso especificamente ). Então, resumindo: você só deve chamar um método explicitamente através de uma classe quando precisar contornar o polimorfismo de subtipo por algum [bom] motivo. Se o método não foi substituído, as duas maneiras são iguais, masself.distToPoint(p)
são mais curtas e mais legíveis, (continuação) #@classmethod
antes do método e depois disso não terá mais uma instância (self
) como o primeiro argumento - em vez disso, obtém a classe, portanto, deve nomear o primeiro argumento, por exemplo.cls
em vez de. Depois disso, você pode ligar para o classmethod quer comoobj.distToPoint(p)
ouclassname.distToPoint(p)
(note a falta deobj
). Você provavelmente ainda deve usar (continuação) #obj.distToPoint(p)
no entanto, se você tiver apenas uma instância relevante em suas mãos, a menos que - novamente - você tenha algum [bom] motivo para contornar o polimorfismo de subtipo, pois o método de classe também poderia ter sido substituído em uma subclasse em geral. Obviamente, se você não tem uma instância relevante disponível, deve chamar o método de classe diretamente por meio de uma classe.