metaclass_4.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. '''
  2. Метод __prepare__ вызывается перед __new__
  3. Создает словарь пространства имен cls_dict
  4. '''
  5. class MyMeta(type):
  6. @staticmethod
  7. def __prepare__(name, bases, **kwargs):
  8. print('MyMeta.__prepare__ called... with {kwargs}')
  9. print()
  10. kwargs['bonus_attr'] = 'hello'
  11. return kwargs
  12. '''
  13. print('name:', name)
  14. print('base: ', bases)
  15. print('kwargs: ', kwargs)
  16. print()
  17. return {'NAME': 'Billy', 'age': 33}
  18. '''
  19. def __new__(cls, name, bases, cls_dict, **kwargs):
  20. print('MyMeta.__new__ called...')
  21. print('cls: ', cls, type(cls))
  22. print('name: ', name, type(name))
  23. print('bases: ', bases, type(bases))
  24. print('cls_dict: ', cls_dict, type(cls_dict))
  25. print('kwargs: ', kwargs)
  26. return super().__new__(cls, name, bases, cls_dict)
  27. class MyClass(metaclass=MyMeta, arg1=10, arg2=15):
  28. pass
  29. def test_1():
  30. my_class = MyClass()
  31. class CustomDict(dict):
  32. def __setitem__(self, key, value):
  33. print(f'Setting {key} = {value} in custom dictionary')
  34. super().__setitem__(key, value)
  35. def __getitem__(self, key):
  36. print(f'Getting {key} from custom dictionary')
  37. return int(super().__getitem__(key))
  38. class MyMeta(type):
  39. @staticmethod
  40. def __prepare__(name, bases):
  41. d = CustomDict()
  42. d[1] = 100
  43. d['a'] = 'b'
  44. return d
  45. def __new__(cls, name, bases, cls_dict):
  46. print()
  47. print('metaclass __new__ called...')
  48. print(f'type(cls_dict) = {type(cls_dict)}')
  49. print(f'cls_dict={cls_dict}')
  50. return super().__new__(cls, name, bases, cls_dict)
  51. class MyClass(metaclass=MyMeta):
  52. pass
  53. print(MyClass.__dict__)
  54. def main():
  55. test_1()
  56. if __name__ == '__main__':
  57. main()