| t | def slotgen(number): | t | def slotgen(number): |
| | | |
| def decorator(cls): | | def decorator(cls): |
| letters = 'abcdefghijklmnopqrstuvwxyz' | | letters = 'abcdefghijklmnopqrstuvwxyz' |
| length = 1 | | length = 1 |
| while len(letters) ** length < number: | | while len(letters) ** length < number: |
| length += 1 | | length += 1 |
| | | |
| def make_name(index): | | def make_name(index): |
| result = [] | | result = [] |
| base = len(letters) | | base = len(letters) |
| for _ in range(length): | | for _ in range(length): |
| index, rem = divmod(index, base) | | index, rem = divmod(index, base) |
| result.append(letters[rem]) | | result.append(letters[rem]) |
| result.reverse() | | result.reverse() |
| return ''.join(result) | | return ''.join(result) |
| slots = [make_name(i) for i in range(number)] | | slots = [make_name(i) for i in range(number)] |
| attrs = {} | | attrs = {} |
| for name, value in cls.__dict__.items(): | | for name, value in cls.__dict__.items(): |
| if name in ('__dict__', '__weakref__', '__slots__'): | | if name in ('__dict__', '__weakref__', '__slots__'): |
| continue | | continue |
| if name in slots: | | if name in slots: |
| continue | | continue |
| attrs[name] = value | | attrs[name] = value |
| attrs['__slots__'] = tuple(slots) | | attrs['__slots__'] = tuple(slots) |
| return type(cls.__name__, cls.__bases__, attrs) | | return type(cls.__name__, cls.__bases__, attrs) |
| return decorator | | return decorator |