Я хочу применить тот же декоратор к каждому методу в данном классе, кроме тех, которые начинаются и заканчиваются на __
.
Мне кажется, что это нужно сделать с помощью декоратора класса. Есть ли подводные камни, о которых нужно знать?
В идеале я также хотел бы иметь возможность:
- отключить этот механизм для некоторых методов, пометив их специальным декоратором
- включить этот механизм для подклассов, а также
- включить этот механизм даже для методов, которые добавляются в этот класс во время выполнения
[Примечание: я использую Python 3.2, поэтому я в порядке, если это зависит от недавно добавленных функций.]
Здесь моя попытка:
_methods_to_skip = {}
def apply(decorator):
def apply_decorator(cls):
for method_name, method in get_all_instance_methods(cls):
if (cls, method) in _methods_to_skip:
continue
if method_name[:2] == `__` and method_name[-2:] == `__`:
continue
cls.method_name = decorator(method)
return apply_decorator
def dont_decorate(method):
_methods_to_skip.add((get_class_from_method(method), method))
return method
Вот у меня проблемы с:
- как реализовать функцию
get_all_instance_methods
- Не уверен, что строка
cls.method_name = decorator(method)
верна. - как сделать то же самое с любыми методами, добавленными в класс во время выполнения
- как применить это к подклассам
- как реализовать
get_class_from_method