Каким образом можно написать кастомный метакласс, который автоматически добавляет префикс ко всем методам создаваемого класса?

Метакласс может преобразовать 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 исчезает, поэтому внутренние обращения к нему тоже требуют согласования.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее