定义一个Python类,可以根据运行时变量选择使用__slots__

时间:2015-06-02 23:36:00

标签: python

我使用的Python模块最近更新了,现在它的所有类都使用__slots__,因此打破了我所依赖的一些功能。有一些解决方案:

  1. 将代码复制到我自己的仓库中,__slots__被黑了。显然最容易,但我不愿意。
  2. 通过猴子修补删除__slots__。我写了一个光荣的hacky函数,它搜索模块中的所有类,任何__slots__被替换为添加了__dict__的克隆类,并删除了成员描述符和插槽。
  3. 解决方案2有效,但感觉就像是黑客。我更喜欢构建一种方法,允许模块可选地打开或关闭__slots__ ,然后向作者发出拉取请求。事实证明这非常棘手。

    我的第一次尝试:

    module.py:

    USE_SLOTS = True
    class SomeClass(object):
        if USE_SLOTS:
            __slots__ = ()
    

    如果您可以确保在USE_SLOTS导入module.py之前将USE_SLOTS设置为False(并因此详细说明),那么这样可行,但它确实非常精致且会意外中断。

    工厂类可能是理想的,因为这将返回基于if obj.__class__ == SomeClass的不同类,但是库中充满了isinstance(obj, SomeClass)而不是{{1}},所以这不会起作用。

    我现在花了这么长时间,所以有人对如何做到这一点有好主意吗?

0 个答案:

没有答案