О работе с метакласами по порядку:
1)Простой пример создания метакласса:
# coding=utf-8
class AttributeInitType(type):
def __call__(self, *args, **kwargs):
"""Вызов класса при котором создается новый объект. """
#создаем сам объект
obj = type.__call__(self, *args)
#добавляем нашему классу переданные атрибуты
for name in kwargs:
setattr(obj, name, kwargs[name])
# вернем готовый объект
return obj
#создадим новый класс на основе нашего метакласса
class Example(object):
__metaclass__ = AttributeInitType
#cоздаем объект и его атрибуты через аргументы
me = Example(height = 180, weigth = 80)
print me.height #180
print me.weigth #80
2)Пример определения абстрактного класса:
from abc import ABCMeta, abstractmethod
class A(object):
__metaclass__=ABCMeta
@abstractmethod
def foo(self): pass
print A()
# Traceback (most recent call last):
# File "", line 1, in
# TypeError: Can't instantiate abstract class A with abstract methods foo
class C(A):
def foo(self): print(42)
print C
#
a=C()
a.foo() #42