我想在本地範圍內將類的方法作爲函數(裝飾後)公開。例如,如果我有一個類和裝飾:如何在Python中自動公開和裝飾函數版本的方法?
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
,如果我不關心automizing的過程中,我可以在下面的代碼添加到我的模塊如下:
@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)
的效果以下評估爲真
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)
會做的伎倆(雖然它感覺有點錯誤這樣聲明局部變量)。我怎樣才能做到這一點,使方法的所有相關屬性正確轉換爲函數版本?我將不勝感激任何建議。
P.S.
我知道我可以裝飾類實例的方法,但這並不是我所追求的。它更多的是(1)對函數版本語法的偏好(2)我的裝飾器使函數映射超過對象的集合,並且花哨和優化的方式。通過裝飾方法獲取行爲(2)需要我的集合類從它們包含的對象繼承屬性,這與對集合語義是正交的。
修改由'locals()'返回的字典是未定義的。我想知道你爲什麼在這裏使用'locals()'而不是'globals()'。據我所知,這些功能應該是在模塊的全局範圍內。 – 2012-02-29 19:34:56