在 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
属性从未真正存在过。
今天我尝试在 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 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
属性从未真正存在过。