【问题标题】:How to call global function from class method如何从类方法调用全局函数
【发布时间】:2019-03-22 01:24:04
【问题描述】:

我有以下代码:

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

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

【问题讨论】:

  • 在 python 3.7 中仍然发生这种情况的事实实际上很有趣。什么鬼,蟒蛇。
  • 只是不要使用以双下划线开头的函数名。
  • @Bazingaa 为什么将迄今为止最好的答案作为评论发布?
  • @Aran-Fey:好的,我注意到人们不只欣赏文本作为答案。但是既然你提到了,我可以发布它

标签: python python-3.x python-2.7 class oop


【解决方案1】:

不要使用双下划线。

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()

应该有效

【讨论】:

  • 不,双下划线不是“用于预定义的东西”。这仅在您谈论前导 双下划线时才有效。
【解决方案2】:

我最近在读一本书“Learning Python by O'Reilly”(第 944 页,第 31 章),其中提到当您在 Class 中使用双下划线 __ 作为方法或变量的起始字符时,它会自动将_classname 附加到该函数,其中classname 是类名。这样做是为了将名称本地化到它所属的类。这在 Pseudoprivate 类属性 的上下文中称为 Name Mangling

这样,您可以在两个不同的类AB 中使用相同的名称__variable,因为变量/方法将分别变为私有_A__variable_B__variable。因此,只需使用单个下划线将您的全局函数命名为其他名称即可避免这种冲突。

【讨论】:

  • 但是python为什么要这样做呢?该方法显然没有在类中定义,那么为什么它会被破坏呢?在寻找这个问题的解决方案时,我很难找到这个答案,尤其是在尝试从 Java 和 C# 学习 Python 时
猜你喜欢
  • 2013-06-21
  • 2018-05-23
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2015-12-18
相关资源
最近更新 更多