今天我尝试在一个类中递归调用私有方法:
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)
但是,还有另一种(或更好的)方法可以将这个私有函数称为类吗?
答案 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
从未真正存在过。