| n | class _GenAccessor: | n | class _GenView: |
| | | |
| n | def __get__(self, instance, owner=None): | n | def __get__(self, inst, owner=None): |
| return type(owner)._cnt | | return type(owner)._gen_id |
| | | |
| n | def __set__(self, instance, value): | n | def __set__(self, inst, val): |
| raise AttributeError('Генерация доступна только для чтения') | | raise AttributeError('generation is read-only') |
| | | |
| n | def __delete__(self, instance): | n | def __delete__(self, inst): |
| raise AttributeError('Генерация доступна только для чтения') | | raise AttributeError('generation is read-only') |
| | | |
| class Generative(type): | | class Generative(type): |
| n | _cnt = 0 | n | _gen_id = 0 |
| | | |
| n | def __new__(meta, cls_name, bases, attrs, **kw): | n | def __new__(mcls, name, parents, namespace, **opts): |
| new_cls = super().__new__(meta, cls_name, bases, attrs) | | obj = super().__new__(mcls, name, parents, namespace) |
| meta._cnt += 1 | | mcls._gen_id += 1 |
| type.__setattr__(new_cls, 'generation', _GenAccessor()) | | type.__setattr__(obj, 'generation', _GenView()) |
| return new_cls | | return obj |
| | | |
| n | def __setattr__(cls, at, value): | n | def __setattr__(cls, key, val): |
| if at == 'generation': | | if key == 'generation': |
| raise AttributeError('Генерация доступна только для чтения') | | raise AttributeError('generation is read-only') |
| return super().__setattr__(at, value) | | return super().__setattr__(key, val) |
| | | |
| t | def __delattr__(cls, at): | t | def __delattr__(cls, key): |
| if at == 'generation': | | if key == 'generation': |
| raise AttributeError('Генерация доступна только для чтения') | | raise AttributeError('generation is read-only') |
| return super().__delattr__(cls, at) | | return super().__delattr__(key) |