How are Python metaclasses different from regular class inheritance?
本问题已经有最佳答案,请猛点这里访问。
这可能是一个开放式的问题,但我刚刚学习了Python中的元类,我不明白元类与父类继承子类有什么不同,比如
1 | class child(parent): |
这难道不符合元类的目的吗?我想我可能不理解元类的目的。
区别在于,从类继承不会影响类的创建方式,它只影响类实例的创建方式。如果你这样做:
1 2 3 4 5 | class A(object): # stuff class B(A): # stuff |
那么,当创建B时,A没有任何"钩住"的机会。可以在创建B的实例时调用A的方法,但不能在创建B类本身时调用。
元类允许您为创建类时定义自定义行为。请参考我标记为重复的问题,以获取元类如何工作的示例,并说服自己,这些示例中存在一些您不能用普通继承实现的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class AccessorType(type): def __init__(self, name, bases, d): type.__init__(self, name, bases, d) accessors = {} prefixs = ["get_","set_","del_"] for k in d.keys(): v = getattr(self, k) for i in range(3): if k.startswith(prefixs[i]): accessors.setdefault(k[4:], [None, None, None])[i] = v for name, (getter, setter, deler) in accessors.items(): # create default behaviours for the property - if we leave # the getter as None we won't be able to getattr, etc.. # [...] some code that implements the above comment setattr(self, name, property(getter, setter, deler,"")) |