Как метаклассы Python отличаются от обычного наследования классов? [дубликат]

этот вопрос уже есть ответ здесь:

это может быть слишком открытым вопросом, но я только сейчас узнаю о метаклассах в Python, и я не понимаю, как метакласс отличается от того, что дочерний класс наследуется от родительского класс, как

class child(parent):

разве это не служило бы той же цели метакласса? Наверное, я не понимаю назначение метакласса.

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

разница в том, что наследование от класса не влияет, как класс создается, это влияет только на то, как создаются экземпляры класса. Если у вас:

class A(object):
    # stuff

class B(A):
    # stuff

тогда A не имеет возможности "подключиться" при создании B. Методы могут быть вызваны, когда экземпляр of B создается, но не при создании самого класса B.

метаклассы позволяют определить пользовательское поведение при создании класса. Обратитесь к вопросу, который я отметил как дубликат для примеров работы метаклассов, и убедитесь, что в этих примерах есть эффекты, которых вы не можете достичь при нормальном наследовании.