Я хочу применить один и тот же декоратор ко всем методам данного класса, кроме тех, которые начинаются и заканчиваются на __
.
Мне кажется, это должно быть выполнимо с помощью декоратора класса. Есть ли подводные камни, о которых нужно знать?
В идеале я также хотел бы иметь возможность:
- отключить этот механизм для некоторых методов, пометив их специальным декоратором
- включить этот механизм и для подклассов
- включить этот механизм даже для методов, которые добавляются к этому классу во время выполнения
[Примечание: я использую 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
get_all_attributes
:for f in dir(cls): print(f, type(cls.__getattribute__(f)))
- person alexis   schedule 09.04.2012