如何在python中定义等效的私有方法

时间:2015-01-30 01:07:09

标签: java python

我是java的新手。

在java中我们会有像

这样的东西
public void func1()
{
    func2();
}

private void func2(){}

但是,在python中我想要等效的

def func1(self):
    self.func2("haha")
    pass

def func2(str):
    pass

它抛出了一个错误,只需要1个参数(给定2个)

我已检查过使用

等解决方案
def func1(self):
    self.func2("haha")
    pass

@classmethod 
def func2(str):
    pass

但它不起作用

在func2中取出self会使全局名称func2无法定义。

我如何完全解决这种情况。

3 个答案:

答案 0 :(得分:5)

通常你会这样做:

class Foo(object):
    def func1(self):
        self._func2("haha")

    def _func2(self, arg):
        """This method is 'private' by convention because of the leading underscore in the name."""
        print arg

f = Foo()  # make an instance of the class.
f.func1()  # call it's public method.

请注意,python没有 true 隐私。如果用户想要调用您的方法,他们可以。这只是口头禅"We're all consenting adults here"所描述的生活现实。但是,如果他们将您的方法称为带有下划线的前缀,则他们应该得到任何破坏。

另请注意,有两个级别的隐私:

def _private_method(self, ...):  # 'Normal'
    ...

def __private_with_name_mangling(self, ...):  # This name gets mangled to avoid collisions with base classes.
    ...

可以在tutorial找到更多信息。

答案 1 :(得分:2)

另一种可能性是你希望func2是私有的(仅存在于func1的范围内)。如果是这样,你可以这样做:

def func1(self, args):
    def func2(args):
        # do stuff
        pass
    return func2(args)

答案 2 :(得分:1)

试试这个:

class Foo:
  def method(self):
    self.static_method("haha")

  @classmethod 
  def static_method(clazz, str):
     print(str)

>>> Foo().method()
haha
>>> Foo.static_method('hi')
hi