如何在python中构建公共和私有方法



假设我有一个类,它有几个公共方法和几个_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的代码分析,因此您没有为虚线样式提供代码补全。
  • 你的编码开销是:
    • 导入装饰器
    • 装饰助手

相关内容

  • 没有找到相关文章

最新更新