Python MetaClass Magic

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

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

以下是示例代码

Comments