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

40

这可能是一个太过开放的问题,但我现在刚开始学习Python中的元类,并且我不明白元类与仅仅让子类继承父类之间有什么区别,例如

class child(parent):

这样做不是与元类达到了相同的目的吗?我想也许我不理解元类的目的。


这怎么是重复的?我不是在问'什么是元类',而且我已经读了那个帖子几次了。 - user2897013
我特别想知道以下问题:元类和子类继承父类之间的区别是什么,正如我在问题中所说的那样。 - user2897013
2
你所问的是那个问题中所问的一部分,如果你阅读并理解了那个问题的答案,你就会明白你所问的区别。 - BrenBarn
2个回答

12

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

class A(object):
    # stuff

class B(A):
    # stuff

那么当B被创建时,A就没有任何机会“hook in”。在创建B的实例时可以调用A的方法,但不能在创建类B本身时调用。

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


尝试在YouTube上寻找视频教程,那可能会更有帮助。 - david
@BrenBarn,这是最好的一行答案。谢谢! - Sarang Manjrekar

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

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