Я хотел бы представить методы класса как функции (после оформления) в моей локальной области видимости.Например, если бы у меня был класс и декоратор:
def some_decorator(f):
...transform f...
return decorated_f
class C(object):
def __init__(self,x):
self.x = x
def f(self,y):
"Some doc string"
return self.x + y
def g(self,y,z):
"Some other doc string"
return self.x + y + z
и если я не заботился об автоматизации процесса, я мог бы добавить следующий код в мой модуль:
@some_decorator
def f(C_instance,x):
"Some doc string."
return C_instance.f(x)
@some_decorator
def g(C_instance,x,y):
"Some other doc string."
return C_instance.g(x,y)
для того, чтобы следующее значение оценивалось как True
c = C(0)
f(c,1) == c.f(1)
Но я бы хотел сделать это автоматически.Что-то вроде:
my_funs = expose_methods(MyClass)
for funname, fun in my_funs.iteritems():
locals()[funname] = some_decorator(fun)
foo = MyClass(data)
some_functionality(foo,*args) == foo.some_functionality(*args)
сделает свое дело (хотя он чувствует себя немного неправильно, объявляя локальные переменные таким образом).Как я могу сделать это таким образом, чтобы все соответствующие атрибуты метода правильно преобразовывались в версии функций?Буду признателен за любые предложения.
PS
Я знаю, что могу украсить методы экземпляров классов, но на самом деле это не то, что мне нужно.Это больше касается (1) предпочтения синтаксиса версии функции (2) того факта, что мои декораторы заставляют функции отображать коллекции объектов причудливыми и оптимизированными способами.Получение поведения (2) путем декорирования методов потребовало бы, чтобы классы моих коллекций наследовали атрибуты от содержащихся в них объектов, что ортогонально семантике коллекции.