如何从类方法调用全局函数

10

我有以下代码:

def __static_func(name):
    print 'Name = ' + name

class A:
    def __init__(self, name):
        self.name = name
    def fun(self):
        __static_func(self.name)

a = A('foo')
a.fun()

在Python 2.7上启动后,它会产生

NameError: global name '_A__static_func' is not defined

那么问题是如何从类方法内调用全局函数?


3
Python 3.7 仍然存在这种问题,实在是太搞笑了。到底怎么回事,Python? - Aran-Fey
2
不要使用以双下划线开头的函数名。 - Thierry Lathuille
2
@Bazingaa,为什么目前最佳答案被发布为评论? - Aran-Fey
2
@Aran-Fey:好的,我注意到人们不喜欢只有文字的回答。但既然你提到了,我可以发帖。 - Sheldore
2个回答

17
我最近在阅读一本书 "Learning Python by O'Reilly"(第31章,第944页),提到当您在Class中使用双下划线__作为方法或变量的起始字符时,它会自动将_classname附加到该函数中,其中classname是类名。这样做是为了将名称局部化到其所属的类。在伪私有类属性的上下文中,这被称为Name Mangling
通过这种方式,您可以在两个不同的类AB中使用相同的名称__variable,因为变量/方法将分别变为私有的_A__variable_B__variable。因此,只需将全局函数命名为其他名称,例如带有单个下划线,以避免此冲突。

但是为什么Python会这样做呢?显然,该方法未在类中定义,那么为什么它会像被定义了一样被处理?当我尝试从Java和C#转换学习Python时,在寻找解决此问题的方法时,我很难找到这个答案。 - Incognito

5

不要使用双下划线。

def _static_func(name):
    print 'Name = ' + name

class A:
    def __init__(self, name):
        self.name = name
    def fun(self):
        _static_func(self.name)

a = A('foo')
a.fun()

应该可以正常工作


1
不,双下划线并不是“预定义的东西”。只有在谈论前导和尾随双下划线时才有效。 - Matthias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接