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

Pythonic way to calling a private function recursively within a class

今天我尝试在 class:

中递归调用私有方法
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)

在 class 作用域 外部调用私有函数

但是,在 class?

中还有其他(或更好的)方法来调用此私有函数

如果您从外部调用它,您可能需要这样的东西:

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)

注意:你不需要return任何东西。

作为补充,如果您想知道为什么 __findJokers 方法只能从 class 方法内部访问,它是这样工作的:

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

__findJokers 已在内部 class 词典中重命名为 _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 属性从未真正存在过。