请求包的用户扩展一个类是unPythonic,但是用户无法实例化它?

时间:2017-06-06 22:25:02

标签: python python-3.x class plugins

我正在编写C库的Python绑定,它允许用户在C中创建自定义“类”并通过另一个对象实例化它们,如:

my_class = create_class(init_callback, finalize_callback, ...);
instance1 = manager_create_object(some_manager, my_class, ...);
instance2 = manager_create_object(some_manager, my_class, ...);

不幸的是,C语言不是面向对象的,所以这个库在语言提供的范围内使用了这个概念。

在Python中,为了让用户定义自己的类,我想使用Python类的概念:

class MyClass(package.BaseClass):
    def __init__(self, ...):
        ...

    def _finalize(self, ...):
        ...


instance1 = some_manager.create_object(MyClass, ...)
instance2 = some_manager.create_object(MyClass, ...)

我无法直接使用MyClass()实例化对象,因为它需要所述管理员(请参阅上面的manager_create_object())。

要求用户扩展包的类(在此示例中为package.BaseClass)而不能直接使用MyClass实例化派生类(MyClass()),这是不是很奇怪/ unPythonic?这主要是针对插件接口,我们需要用户在Python模块文件中定义一个或多个类。

1 个答案:

答案 0 :(得分:0)

坚持用户(客户端)提供某些功能的本地实现并不罕见,特别是如果您可以提供所需支持的示例和/或模板。许多供应商都这样做,因为它们无法涵盖所有​​实施。

但是,让确定你提供了各种各样的例子。您想让您的用户轻松上手。更好的是,提供构成几个流行环境的工作实现的文件。