Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
# метакласс наследуется от Type
class Final(type):
def __new__(mcls, name, bases, attrs):
"""
:param name: Имя нового класса
:param bases: Список его базовых классов
:param attrs: Набор атрибутов класса
:return: новый класс
"""
for base in bases:
# является ли тип класса подклассом Final
if issubclass(type(base), Final):
# тогда - ошибка! нельзя содзать подкласс Final
raise TypeError(f'{name} is final!')
# иначе - обычное поведение
return super().__new__(mcls, name, bases, attrs)
def final(cls):
__name = str(cls.__name__)
__bases = tuple(cls.__bases__)
__dict = dict(cls.__dict__)
for each_slot in __dict.get("__slots__", tuple()):
__dict.pop(each_slot, None)
__dict["__metaclass__"] = Final
__dict["__wrapped__"] = cls
return Final(__name, __bases, __dict)
# test:
@final
class A:
...
# будет ошибка, потому что A - final!
class B(A):
...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment