【问题标题】:pythonic way for implementing interface for modules实现模块接口的pythonic方式
【发布时间】:2017-07-04 08:47:33
【问题描述】:

我有一组函数定义了我想要的行为(接口)。

这个组可以封装在一个类中,所以我可以“强制”我想要的行为(引发未实现的错误)。

但另一方面,它不是很pythonic,而且这个类只是一个带有一堆静态方法的类。

因此,如果我使用带有功能的模块,我无法强制该模块实现所有所需的功能。

任何想法如何强制一个模块来实现我想要的所有功能,而不将它包装在一个类中?

提前致谢!

【问题讨论】:

  • 为什么需要强制执行任何事情?您是否要求其他人实现 API?
  • 想把它作为工厂的一部分,所以app的其他部分只能动态获取对象,不同的实现使用相同的函数名
  • 那么为什么需要强制执行?
  • 防止在使用未实现的函数时出现属性错误
  • 您始终可以在导入时检查模块以了解是否定义了所需的功能集,但这并不能保证它们被“正确”定义 - 不会超过它所保证的实际上是一个类......另外,如果你有充分的理由,使用类作为命名空间也不一定是 unpythonic。

标签: python interface module


【解决方案1】:

一种解决方案是让您的工厂拥有一种“注册”实现的方法和另一种“获取”特定实现的方法。一个有效的实现将是一个具有所需方法名称的对象。

class MyFactory:
    def register(self, name, implementation):
        # check implementation somehow and raise an Exception if it's not valid
        # insure implementation has all required function names and they are callable

    def get_implementation(self, name):
        # returns a previously registered implementation

你在这里真正完成的唯一一件事是,一个无效的实现在你注册它时会抛出一个异常,而不是在你使用它时抛出一个异常。这种事情是否值得努力是值得怀疑的。当您使用一个实现时,有无数种方法可能无法正常工作,而注册只能捕获其中最明显的一种(缺少函数名称)。

【讨论】:

    猜你喜欢
    • 2019-01-15
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多