| t | class Generative(type): | t | class Generative(type): |
| _generation_counter = 0 | | _generation_counter = 0 |
| | | |
| def __new__(mcs, name, bases, namespace, **kwargs): | | def __new__(mcs, name, bases, namespace, **kwargs): |
| mcs._generation_counter += 1 | | mcs._generation_counter += 1 |
| cls = super().__new__(mcs, name, bases, namespace, **kwargs) | | cls = super().__new__(mcs, name, bases, namespace, **kwargs) |
| super().__setattr__(cls, 'generation', GenerationDescriptor(mcs) | | super().__setattr__(cls, 'generation', GenerationDescriptor(mcs) |
| ) | | ) |
| return cls | | return cls |
| | | |
| def __setattr__(cls, name, value): | | def __setattr__(cls, name, value): |
| if name == 'generation': | | if name == 'generation': |
| raise AttributeError("Cannot set attribute 'generation'") | | raise AttributeError("Cannot set attribute 'generation'") |
| super().__setattr__(cls, name, value) | | super().__setattr__(cls, name, value) |
| | | |
| def __delattr__(cls, name): | | def __delattr__(cls, name): |
| if name == 'generation': | | if name == 'generation': |
| raise AttributeError("Cannot delete attribute 'generation'") | | raise AttributeError("Cannot delete attribute 'generation'") |
| super().__delattr__(cls, name) | | super().__delattr__(cls, name) |
| | | |
| class GenerationDescriptor: | | class GenerationDescriptor: |
| | | |
| def __init__(self, metaclass): | | def __init__(self, metaclass): |
| self.metaclass = metaclass | | self.metaclass = metaclass |
| | | |
| def __get__(self, obj, objtype=None): | | def __get__(self, obj, objtype=None): |
| return self.metaclass._generation_counter | | return self.metaclass._generation_counter |