当前位置:  开发笔记 > 编程语言 > 正文

Python元类

如何解决《Python元类》经验,为你挑选了1个好方法。

我一直在使用Python破解类:

def hack(f,aClass) :
  class MyClass(aClass) :
     def f(self) :
       f()
  return MyClass

A = hack(afunc,A)

这看起来很干净.它需要一个类,A,创建一个派生自它的新类,它有一个额外的方法,调用f,然后将新类重新分配给A.

这与Python中的元类黑客有何不同?使用元类比这有什么好处?



1> Jarret Hardi..:

Python中类的定义是类型的实例(或类型的子类的实例).换句话说,类定义本身就是一个对象.使用元类,您可以控制成为类定义的类型实例.

调用元类时,您可以完全重写类定义.您可以访问类的所有建议属性,它的祖先等.除了注入方法或删除方法之外,您还可以从根本上改变继承树,类型以及几乎任何其他方面.您还可以将元类链接在一起,以获得非常动态且完全复杂的体验.

我认为真正的好处是,类的类型仍然是类的类型.在您的示例中,键入:

a_inst = A()
type(a_inst)

将表明它是一个实例MyClass.是的,isinstance(a_inst, aClass)会返回True,但是你引入了一个子类,而不是一个动态重新定义的类.区别可能是关键.

正如rjh指出的那样,匿名内部类也具有性能和可扩展性含义.元类只处理一次,并且是定义类的时刻,而不是再次处理.API的用户也可以扩展您的元类,因为它没有包含在函数中,因此您获得了一定程度的可扩展性.

这篇稍微陈旧的文章实际上有一个很好的解释,它将您在示例中使用的"函数修饰"方法与元类完全比较,并在该上下文中显示了Python元类演变的历史记录:http://www.ibm.com/developerworks /linux/library/l-pymeta.html

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有