Метакласс может преобразовать namespace в new перед созданием класса. Обычно переименовывают обычные методы, сохраняя специальные dunder-методы, иначе нарушается протокол Python.
Каким образом можно написать кастомный метакласс, который автоматически добавляет префикс ко всем методам создаваемого класса?
Метакласс может преобразовать namespace в __new__ перед созданием класса. Обычно переименовывают обычные методы, сохраняя специальные __dunder__-методы, иначе нарушается протокол Python.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Метакласс может преобразовать namespace в new перед созданием класса. Обычно переименовывают обычные методы, сохраняя специальные dunder-методы, иначе нарушается протокол Python.
from types import FunctionType
class PrefixMethods(type):
def __new__(mcls, name, bases, namespace, **kwargs):
result = {}
for key, value in namespace.items():
method = isinstance(value, (FunctionType, staticmethod, classmethod))
special = key.startswith('__') and key.endswith('__')
target = 'api_' + key if method and not special else key
if target != key and target in namespace:
raise TypeError(f'Name collision: {target}')
result[target] = value
return super().__new__(mcls, name, bases, result, **kwargs)
class Service(metaclass=PrefixMethods):
def ping(self):
return 'pong'
assert Service().api_ping() == 'pong'
Пример меняет только методы, объявленные в этом классе, не унаследованные. Property и произвольные callable-атрибуты не переименовываются. Старое имя ping исчезает, поэтому внутренние обращения к нему тоже требуют согласования.