掛接到被稱爲你必須使用一個裝飾方法:
def increment_counter(method):
def wrapper(self, *args, **kw):
self._COUNTER += 1
return method(self, *args, **kw)
return wrapper
,並應用該到每個方法在你的班級:
class A(object):
_COUNTER = 0
@increment_counter
def do_something_1(self):
...
@increment_counter
def do_something_2(self):
...
@increment_counter
def do_something_N(self):
...
請注意,我將計數器重命名爲使用一個下劃線,以避免必須弄清楚損壞的名稱。
如果必須有__COUNTER
工作(所以用雙下劃線),你能做到這一點通過傳遞類的名稱:
def increment_counter(classname):
counter_attribute = '_{}__COUNTER'.format(classname)
def increment_counter_decorator(method):
def wrapper(self, *args, **kw):
setattr(self, counter_attribute, getattr(self, counter_attribute) + 1)
return method(self, *args, **kw)
return wrapper
然後裝飾與方法:
@increment_counter('A')
def do_something_1(self):
...
如果您想創建一個計數器而不是每個實例而只需添加到類的計數器:
class A(object):
_COUNTER = 0
def __init__(self):
A._COUNTER += 1
或使用type(self)._COUNTER
,如果你想使用每個子類的A
一個獨立的計數器。
使用裝飾:http://www.artima.com/weblogs/viewpost.jsp?thread=240808 –
您的問題現在已變得模糊。您是否想在創建新實例時或在實例上調用方法*時增加計數器?你的榜樣意味着第一個,但你的問題的其餘部分要求後者! –
如果寫得含糊不清,我很抱歉。我想增加新實例 –