123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- '''
- Метод __prepare__ вызывается перед __new__
- Создает словарь пространства имен cls_dict
- '''
- class MyMeta(type):
- @staticmethod
- def __prepare__(name, bases, **kwargs):
- print('MyMeta.__prepare__ called... with {kwargs}')
- print()
- kwargs['bonus_attr'] = 'hello'
- return kwargs
-
- '''
- print('name:', name)
- print('base: ', bases)
- print('kwargs: ', kwargs)
- print()
- return {'NAME': 'Billy', 'age': 33}
- '''
- def __new__(cls, name, bases, cls_dict, **kwargs):
- print('MyMeta.__new__ called...')
- print('cls: ', cls, type(cls))
- print('name: ', name, type(name))
- print('bases: ', bases, type(bases))
- print('cls_dict: ', cls_dict, type(cls_dict))
- print('kwargs: ', kwargs)
- return super().__new__(cls, name, bases, cls_dict)
-
- class MyClass(metaclass=MyMeta, arg1=10, arg2=15):
- pass
- def test_1():
- my_class = MyClass()
- class CustomDict(dict):
- def __setitem__(self, key, value):
- print(f'Setting {key} = {value} in custom dictionary')
- super().__setitem__(key, value)
- def __getitem__(self, key):
- print(f'Getting {key} from custom dictionary')
- return int(super().__getitem__(key))
- class MyMeta(type):
- @staticmethod
- def __prepare__(name, bases):
- d = CustomDict()
- d[1] = 100
- d['a'] = 'b'
- return d
- def __new__(cls, name, bases, cls_dict):
- print()
- print('metaclass __new__ called...')
- print(f'type(cls_dict) = {type(cls_dict)}')
- print(f'cls_dict={cls_dict}')
- return super().__new__(cls, name, bases, cls_dict)
- class MyClass(metaclass=MyMeta):
- pass
- print(MyClass.__dict__)
- def main():
- test_1()
-
- if __name__ == '__main__':
- main()
|