Как метаклассы Python отличаются от обычного наследования классов? [дубликат]
этот вопрос уже есть ответ здесь:
- Что такое метаклассы в Python? 17 ответов
это может быть слишком открытым вопросом, но я только сейчас узнаю о метаклассах в 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.
метаклассы позволяют определить пользовательское поведение при создании класса. Обратитесь к вопросу, который я отметил как дубликат для примеров работы метаклассов, и убедитесь, что в этих примерах есть эффекты, которых вы не можете достичь при нормальном наследовании.