metaclass_3.py 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. '''Параметры метакласса'''
  2. '''Шаблон для создания метакласса'''
  3. class NewMetaclass(type):
  4. def __new__(mcls, name, bases, cls_dict):
  5. return super().__new__(mcls, name, bases, cls_dict)
  6. class MyClass(metaclass=NewMetaclass):
  7. pass
  8. '''Дополнительные аргументы'''
  9. class Metaclass(type):
  10. def __new__(cls, name, bases, cls_dict, arg1, arg2, arg3=None):
  11. print('Запуск создания нового типа данных', arg1, arg2, arg3)
  12. return super().__new__(cls, name, bases, cls_dict)
  13. class MyClass1(metaclass=Metaclass, arg1=10, arg2=20, arg3=30):
  14. pass
  15. class MyClass2(metaclass=Metaclass, arg1=10, arg2=5):
  16. pass
  17. '''Передача коллекции атрибутов'''
  18. class AutoClassAttrib(type):
  19. def __new__(cls, name, bases, cls_dict, extra_attrs=None):
  20. new_cls = super().__new__(cls, name, bases, cls_dict)
  21. if extra_attrs:
  22. print('Creating class with some extra attributes: ', extra_attrs)
  23. for attr_name, attr_value in extra_attrs:
  24. setattr(new_cls, attr_name, attr_value)
  25. return new_cls
  26. class Account(metaclass=AutoClassAttrib,
  27. extra_attrs=[
  28. ('account_type', 'debit'),
  29. ('city', 'Paris'),
  30. ('overdraft', 1000)]
  31. ):
  32. pass
  33. def test_1():
  34. print(Account.__dict__)
  35. print('-' * 15)
  36. class Person(object, metaclass=AutoClassAttrib,
  37. extra_attrs=[
  38. ('country', 'Tailand'),
  39. ('citizen', True)
  40. ]):
  41. def __init__(self, name, age):
  42. self.name = name
  43. self.age = age
  44. print(Person.__dict__)
  45. def main():
  46. test_1()
  47. if __name__ == '__main__':
  48. main()