在同一类中调用私有函数 Python
我怎么才能在同一个类里的其他函数中调用一个私有函数呢?
class Foo:
def __bar(arg):
#do something
def baz(self, arg):
#want to call __bar
现在,当我这样做的时候:
__bar(val)
从baz()函数里,我得到了这个:
NameError: global name '_Foo__createCodeBehind' is not defined
有人能告诉我这个错误的原因吗?另外,我怎么能从一个私有函数里调用另一个私有函数呢?
2 个回答
12
__bar
是“私有”的(意思是它的名字被改名了),但它仍然是 Foo
类中的一个方法,所以你必须通过 self
来引用它,并且在调用时要把 self
传给它。仅仅用 __bar()
直接调用是行不通的;你得这样调用:self.__bar()
。所以……
>>> class Foo(object):
... def __bar(self, arg):
... print '__bar called with arg ' + arg
... def baz(self, arg):
... self.__bar(arg)
...
>>> f = Foo()
>>> f.baz('a')
__bar called with arg a
你可以在 Foo
的定义内部随意访问 self.__bar
,但一旦你在定义外部,就得用 foo_object._Foo__bar()
来访问。这是为了避免在类继承的情况下出现名字冲突。
如果你不是因为这个原因在使用这个特性,可能要考虑一下是否真的需要使用它。在 Python 中创建“私有”变量和方法的惯例是给名字前面加一个下划线(underscore)。这没有语法上的特殊意义,但它向使用你代码的人传达了这个变量或方法是实现细节的一部分,可能会发生变化。
61
在Python中,没有像C/C++那样隐含的this->
。你需要在self
上调用它。
class Foo:
def __bar(self, arg):
#do something
def baz(self, arg):
self.__bar(arg)
不过,这些方法并不是真正的私有。当你用两个下划线开头命名一个方法时,Python会进行一些名称处理,让它看起来像是“私有”的,但实际上并没有像其他语言那样强制限制。如果你在Foo
中定义了__bar
,你仍然可以通过Foo._Foo__bar
从外部访问它。例如,你可以这样做:
f = Foo()
f._Foo__bar('a')
这也解释了你收到的错误信息中“奇怪”的标识符。
你可以在文档中找到它,这里
。