Синтаксис класса поддерживает именованные аргументы:
class Klass(Parent, arg='arg')
Ключевое слово
metaclass зарезервировано для указания метакласса, но остальные аргументы можно использовать свободно.Ниже приведён пример метакласса, который создаёт класс без одного из атрибутов.
Имя атрибута, который нужно удалить, передаётся через аргумент
remove:
class FilterMeta(type):
def __new__(mcs, name, bases, namespace, remove=None, **kwargs):
if remove is not None and remove in namespace:
del namespace[remove]
return super().__new__(mcs, name, bases, namespace)
class A(metaclass=FilterMeta, remove='half'):
def half(x):
return x // 2
half_of_4 = half(4)
half_of_100 = half(100)
a = A()
print(a.half_of_4) # 2
print(a.half_of_100) # 50
a.half # AttributeError
В этом примере метод
half удаляется из класса A во время его создания, поэтому попытка обратиться к a.half вызывает AttributeError.👉@BookPython