Python元类

6
我一直在用Python破解类似这样的代码:
def hack(f,aClass) :
  class MyClass(aClass) :
     def f(self) :
       f()
  return MyClass

A = hack(afunc,A)

这段文字与IT技术有关。其中,它创建了一个基本类A的派生类,该派生类具有额外的方法f,并将新类重新赋值给A。
那么这跟在Python中使用元类有什么区别呢?使用元类有哪些优势呢?

这样做的原因是什么? - S.Lott
3个回答

5
Python中类的定义是type的实例(或type的子类的实例)。换句话说,类定义本身是一个对象。使用元类,您可以控制成为类定义的类型实例。
当调用元类时,您有完全重新编写类定义的能力。您可以访问类的所有提议属性、其祖先等。不仅可以注入方法或删除方法,还可以彻底改变继承树、类型和几乎任何其他方面。您还可以链接元类以获得非常动态和完全混乱的体验。
我想真正的好处是类的类型保持不变。在您的示例中,键入:
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


1

您也可以使用type可调用对象。

def hack(f, aClass):
    newfunc = lambda self: f()
    return type('MyClass', (aClass,), {'f': newfunc})

我发现使用type是进入元类世界最简单的方法。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接