| t | class Generative(type): | t | class Generative(type): |
| _counter = 0 | | _counter = 0 |
| | | |
| class _GenerationDescriptor: | | class _GenerationDescriptor: |
| | | |
| def __get__(self, obj, owner=None): | | def __get__(self, obj, owner=None): |
| if owner is None: | | if owner is None: |
| return None | | return None |
| meta = owner.__class__ | | meta = owner.__class__ |
| return getattr(meta, '_counter', None) | | return getattr(meta, '_counter', None) |
| | | |
| def __set__(self, obj, value): | | def __set__(self, obj, value): |
| raise AttributeError("can't set attribute 'generation'") | | raise AttributeError("can't set attribute 'generation'") |
| | | |
| def __delete__(self, obj): | | def __delete__(self, obj): |
| raise AttributeError("can't delete attribute 'generation'") | | raise AttributeError("can't delete attribute 'generation'") |
| | | |
| def __new__(mcls, name, bases, namespace, **kwargs): | | def __new__(mcls, name, bases, namespace, **kwargs): |
| cls = super().__new__(mcls, name, bases, namespace, **kwargs) | | cls = super().__new__(mcls, name, bases, namespace, **kwargs) |
| mcls._counter += 1 | | mcls._counter += 1 |
| type.__setattr__(cls, 'generation', mcls._GenerationDescriptor() | | type.__setattr__(cls, 'generation', mcls._GenerationDescriptor() |
| ) | | ) |
| return cls | | return cls |
| | | |
| def __setattr__(cls, name, value): | | def __setattr__(cls, name, value): |
| if name == 'generation': | | if name == 'generation': |
| raise AttributeError("can't set attribute 'generation'") | | raise AttributeError("can't set attribute 'generation'") |
| super().__setattr__(name, value) | | super().__setattr__(name, value) |
| | | |
| def __delattr__(cls, name): | | def __delattr__(cls, name): |
| if name == 'generation': | | if name == 'generation': |
| raise AttributeError("can't delete attribute 'generation'") | | raise AttributeError("can't delete attribute 'generation'") |
| super().__delattr__(name) | | super().__delattr__(name) |
| | | |
| class Generative(type): | | class Generative(type): |
| _counter = 0 | | _counter = 0 |
| | | |
| class _GenerationDescriptor: | | class _GenerationDescriptor: |
| | | |
| def __get__(self, obj, owner=None): | | def __get__(self, obj, owner=None): |
| if owner is None: | | if owner is None: |
| return None | | return None |
| meta = owner.__class__ | | meta = owner.__class__ |
| return getattr(meta, '_counter', None) | | return getattr(meta, '_counter', None) |
| | | |
| def __set__(self, obj, value): | | def __set__(self, obj, value): |
| raise AttributeError("can't set attribute 'generation'") | | raise AttributeError("can't set attribute 'generation'") |
| | | |
| def __delete__(self, obj): | | def __delete__(self, obj): |
| raise AttributeError("can't delete attribute 'generation'") | | raise AttributeError("can't delete attribute 'generation'") |
| | | |
| def __new__(mcls, name, bases, namespace, **kwargs): | | def __new__(mcls, name, bases, namespace, **kwargs): |
| cls = super().__new__(mcls, name, bases, namespace, **kwargs) | | cls = super().__new__(mcls, name, bases, namespace, **kwargs) |
| mcls._counter += 1 | | mcls._counter += 1 |
| type.__setattr__(cls, 'generation', mcls._GenerationDescriptor() | | type.__setattr__(cls, 'generation', mcls._GenerationDescriptor() |
| ) | | ) |
| return cls | | return cls |
| | | |
| def __setattr__(cls, name, value): | | def __setattr__(cls, name, value): |
| if name == 'generation': | | if name == 'generation': |
| raise AttributeError("can't set attribute 'generation'") | | raise AttributeError("can't set attribute 'generation'") |
| super().__setattr__(name, value) | | super().__setattr__(name, value) |
| | | |
| def __delattr__(cls, name): | | def __delattr__(cls, name): |
| if name == 'generation': | | if name == 'generation': |
| raise AttributeError("can't delete attribute 'generation'") | | raise AttributeError("can't delete attribute 'generation'") |
| super().__delattr__(name) | | super().__delattr__(name) |