调用类中定义的类外的python方法

时间:2016-05-12 07:25:00

标签: python

lst = [7,1,-5,18]
b = list()
init = lst[0]
for i in range(len(lst)):
    b.append(lst[i])
    if b[i]<init:
        tmp = init
        b[i-1] = b[i]
        b[i] = tmp

print b

当我尝试运行上面的代码时,我收到以下错误:

import math

class Circle(object):    
    def __init__(this,x,y,rad):
        this.x=x
        this.y=y
        this.rad=rad

    def relate(circ1,circ2):
        diff=__posDiff((circ1.x,circ1.y),(circ2.x,circ2.y))
        print diff

def __posDiff(p1,p2):
    diff=math.sqrt((p1[0]-p2[0])**2 + (p1[1]-p2[1])**2)
    return diff

python的新手,无法弄清楚如何在类中调用函数。如果有人可以帮助和解释

1 个答案:

答案 0 :(得分:7)

__posDiff重命名为_posDiff(因此请删除其中一个主要下划线)。

您在名称的开头使用双下划线,并且在类定义中使用此类名称时,Python mangles 该名称以生成类私有名称。此功能用于向不应在子类中意外覆盖的方法添加命名空间。

这适用于类中定义的方法名称,尝试使用此类名称的任何代码。因此,__posDiff方法中对relate的引用被重写为_Circle__posDiff(类名称被添加到创建命名空间之前),但__posDiff函数本身就是没有重新命名,因为它实际上不在课堂内。

请参阅词法分析文档中的Reserved classes of identifiers section

  

__*
  类私有名称。当在类定义的上下文中使用时,此类别中的名称将被重写以使用损坏的表单来帮助避免基类和派生类的“私有”属性之间的名称冲突。请参阅Identifiers (Names)部分。

表达式中的链接Identifiers (Names) section引用:

  

私有名称修改:如果在类定义中以文本方式出现的标识符以两个或多个下划线字符开头,并且不以两个或多个下划线结尾,则将其视为私有名称该课程。在为其生成代码之前,将私有名称转换为更长的形式。转换将在名称前面插入类名,删除前导下划线并插入单个下划线。例如,名为Ham的类中出现的标识符__spam将转换为_Ham__spam 此转换独立于使用标识符的语法上下文。

粗斜体的重点是我的。