关于元类:Python元类与常规类继承有何不同?

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,""))