我必須聲明爲類裝飾:方法飾以裝飾類沒有「自我」的說法冷凍
class predicated(object):
def __init__(self, fn):
self.fn = fn
self.fpred = lambda *args, **kwargs: True
def predicate(self, predicate):
self.fpred = predicate
return self
def validate(self, *args, **kwargs):
return self.fpred(*args, **kwargs)
def __call__(self, *args, **kwargs):
if not self.validate(*args, **kwargs):
raise PredicateNotMatchedError("predicate was not matched")
return self.fn(*args, **kwargs)
...當我用它在一個類來包裝的方法,調用該方法似乎沒有將該對象的實例設置爲第一個參數。雖然這種行爲並不完全出乎意料,但當方法變成實例方法時,我該如何凍結self
?
簡單的例子:FOO的
class test_decorator(object):
def __init__(self, fn):
self.fn = fn
def __call__(self, *args, **kwargs):
return self.fn(*args, **kwargs)
class Foo(object):
@test_decorator
def some_method(self):
print(self)
Foo().some_method()
預計實例,而不是得到一個錯誤說0參數傳遞。
+1對於「簡單示例」:) – 2011-04-11 03:21:53
我猜這是因爲'some_method'不再是函數,而是'test_decorator'類的對象 - 實例 - 所以它不會創建綁定方法。我不知道如何使該場景與「裝飾類」工作雖然.. – 2011-04-11 03:26:18