Python MetaClass Magic

在 Nova 代码中 [0] 发现一个神奇的应用 , 利用 decrator 来区分同名的函数 , 根据 decrator 上面定义的版本 , 来调用不同的方法 。 仔细学习了一下 。 它是用到了 MetaClass。 主要思路是 :

  • 在 decrator 里面 , 把被装饰的方法存在类的一个属性里面 (version_methods)
  • 使用自定义的 metaclass, 删除掉父类上的 version_methods, 并把这个属性放到子类中 。 这样做是为了防止子类共享父类的 version_methods 属性 。
  • 在子类里面 , 重写 __getattribute__ 方法 , 当所需要的属性存在于 version_methods 时 , 根据特定的条件 , 返回期望的方法 。 如果没有 , 就调用父类的方法 。

以下是示例代码

Comments