Pythonic在类中递归调用私有函数的方法

时间:2015-01-15 12:35:33

标签: python recursion

今天我尝试在一个类中递归调用私有方法:

class Bot:
    def __init__(self, sudoku):
        """ init code """

    def __findJokers(self, target):
        """ some validations """
        self.__findJokers(target)

运行我的程序,我已经收到了:

{AttributeError}'Bot' object has no attribute '__findJokers'

搜索一段时间后,我发现您可以使用instance._Bot__findJokers(somevalue)

在类范围内调用外部私人函数

但是,还有另一种(或更好的)方法可以将这个私有函数称为类吗?

2 个答案:

答案 0 :(得分:1)

如果你从外面打电话,你可能想要这样的东西:

class Bot:
    def __init__(self, sudoku):
        """ init code """
        pass

    # public access
    def findJokers(self, target):
        # forward to private
        return self.__findJokers(target)

    # private access
    def __findJokers(self, target):
        """ some validations """
        # hopefully you're doing something else,
        # since this is an infinite recursion.
        return self.__findJokers(target)

注意:您无需返回任何内容。

答案 1 :(得分:0)

作为补充,如果你想知道为什么只能从类方法中访问__findJokers方法,这就是它的工作原理:

>>> dir(Bot)
['_Bot__findJokers', '__doc__', '__init__', '__module__']

__findJokers已在内部类字典中重命名为_Bot_findJokers

然后让我们拆解该方法。

>>> import dis
>>> dis.dis(Bot._Bot__findJokers)
 17           0 LOAD_FAST                0 (self)
              3 LOAD_ATTR                0 (_Bot__findJokers)
[...]

在方法代码中,属性名称也直接替换为_Bot_findJokers。 也可以在这里观察到:

>>> Bot._Bot__findJokers.im_func.func_code.co_names
('_Bot_findJokers',)

这意味着最终,属性__findJokers从未真正存在过。