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

时间:2013-10-19 07:29:43

标签: python metaclass

这可能是一个开放式问题的过多问题,但我现在才刚刚学习Python中的元类,我不明白元类与父类继承的方式有什么不同,比如

class child(parent):

这不符合元类的相同目的吗?我想也许我不明白元类的目的。

2 个答案:

答案 0 :(得分:7)

不同之处在于从类继承不会影响的创建方式,它只会影响如何创建类的实例。如果你这样做:

class A(object):
    # stuff

class B(A):
    # stuff

然后A在创建B时没有任何机会“挂钩”。当创建B的实例时,可以调用A的方法,但是在创建类B本身时则不会。

元类允许您定义创建类时的自定义行为。有关元类如何工作的示例,请参阅我标记为重复的问题,并说服自己在这些示例中存在无法通过正常继承实现的效果。

答案 1 :(得分:2)

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