假设我有一个类,它有几个公共方法和几个_private或"helper"方法。
存在如何在代码中对它们排序的问题。可以是1.2.调用公共函数之后的私有函数。(参见最佳实践:在类定义中对public/protected/private进行排序?
另一种方法是嵌套私有函数,但这有运行时开销。
如何构建代码以便容易地偷看:
- 类 的接口
- 功能的逻辑结构?
这是我自己的答案,但我希望看到其他替代方案。
我将使用函数而不是方法来展示它,当然这同样适用于方法。
我的方法是创建一个装饰器:# helper.py
def helper(func):
def decorator(helper):
helper.__name__ = '{func.__name__}.{helper,__name__}'
然后像这样使用:
from helper import helper
# interface {
def public_func():
public_func.helper1()
public_func.helper2()
def if_the_function_has_a_long_name_you_can():
this = if_the_function_has_a_long_name_you_can
...
this.helper3()
# interface }
# private {
@helper(public_func)
def _helper1():
print('helper1')
@helper(public_func)
def _helper2():
print('helper2')
_helper2.nested_helper()
@helper(if_the_function_has_a_long_name_you_can)
def _helper3():
print('helper3')
@helper(_helper2)
def _nested_helper():
print('nested')
# private }
def not_polite():
public_func.helper1()
public_func.helper2.nested_helper()
优点:
- 代码结构扁平,函数内部没有类和函数
- 仍然有结构,但仅作为文档
- 您可以创建任意嵌套的虚拟结构,甚至不需要创建类或嵌套函数。该结构仅用点号表示:
functionx.helper1.helper12.helper121
- 调试更容易,因为您只能通过函数名看到调用顺序!
- 下划线
_
仅用于定义辅助函数 - 很容易看到什么是辅助函数以及它们服务于哪个函数。
- 辅助函数可以从任何地方调用,甚至从模块外部,(虽然不礼貌)
- 辅助函数仍然可以用它原来的名字
_helperx
调用 - 但是在回溯中出现的辅助函数的名称是虚线样式的
functionx.helpery
缺点
- 将辅助函数作为公共函数的属性添加会混淆ide的代码分析,因此您没有为虚线样式提供代码补全。
- 你的编码开销是:
- 导入装饰器
- 装饰助手