Домой

Последняя активность

  

Метаклассы в Python

PyDeKolt avatar PyDeKolt (0) [#] (27.05.2013 / 16:50)
Созданием самих классов после их объявления занимаются метаклассы. Проще говоря метакласс - это объект, который знает, как создавать классы и управлять ими.

Базовым классом для всех метаклассов является класс type, поэтому именно на его основе создаются пользовательские Метаклассы.
  1. class ColorMeta(type):
  2. """
  3. Метакласс проверяющий наличие строк документирования
  4. у методов класса
  5. """
  6. def __init__(self, cls_name, cls_bases, dict):
  7. for key, value in dict.items():
  8. # пропустить специальные и частные атрибуты
  9. if key.startswith('__'): continue
  10. # пропустить любые невызываемые объекты
  11. if not hasattr(value, '__call__'): continue
  12. # проверить наличие строки документирования
  13. if not getattr(value, '__doc__'):
  14. raise TypeError('У метода %s класса %s, нет строки документирования' % (key, cls_name))
  15. type.__init__(self, cls_name, cls_bases, dict)
  16. class Color:
  17. __metaclass__ = ColorMeta
  18. class Green(Color):
  19. def name(self):
  20. """ Return name class """
  21. return self.__class__.__name__
  22. def test(self): pass
  23. g = Green()
  24. print g.name() # Green
  25. g.test() # TypeError: У метода test класса Green, нет строки документирования

Метаклассы способны изменять класс на этапе его создания.
  1. class BaseMeta(type):
  2. """
  3. Метакласс который добавляет способность говорить объекту
  4. если тот является человеком
  5. """
  6. def __new__(cls, name, bases, dict):
  7. if Man in bases:
  8. bases = bases + (Voice,)
  9. return type.__new__(cls, name, bases, dict)
  10. class Man(object):
  11. """ Человек """
  12. pass
  13. class Voice(object):
  14. """ Голос """
  15. def tell_me(self):
  16. print 'Hello!'
  17. class Albert(Man):
  18. __metaclass__ = BaseMeta
  19. a = Albert()
  20. a.tell_me() # Hello!

- ООП в Python
* Python уроки
  Всего: 1

Зарегистрируйтесь и сможете комментировать все темы. Кнопочка вверху
Фильтр по автору
Скачать тему

В Форум

Новые вверху
Statok.net Рейтинг@Mail.ru
spywap.nettop-sid.ru
Яндекс.Метрика