在Python 3中,你的代碼可以工作,但是在Python 2中,當查找方法時會發生一些包裝。
類VS實例
職業等級
一個靜態類變量上通行的做法是使用可變默認參數:如果你希望它是更漂亮,你可以定義自己的可變
class foo(object):
...
def bar(self, _counter=[0]):
_counter[0] += 1
return _counter[0]
集裝箱:
class MutableDefault(object):
def __init__(self, start=0):
self.value = start
def __iadd__(self, other):
self.value += other
return self
def value(self):
return self.value
和改變,像這樣的代碼:
class foo(object):
def bar(self, _counter=MutableDefault()):
_counter += 1
return _counter.value
實例級別
from functools import partial
class foo(object):
def __init__(self):
def bar(self, _counter=MutableDefault(1)): # create new 'bar' each time
value = _counter.value
_counter += 1
return value
self.bar = partial(bar, self)
摘要
正如你所看到的,可讀性移動到實例級別counter
當把一個嚴重的打擊。我強烈建議你重新強調一下counter
是bar
的一部分的重要性,並且如果它真的很重要,可能使bar
是其自己的類,其實例成爲foo
的實例的一部分。如果不是真的很重要,這樣做的正常方式:
class foo(object):
def __init__(self):
self.bar_counter = 0
def bar(self):
self.bar_counter += 1
return self.bar_counter
應該'counter'是一流的水平(所有實例共享當前計),或實例級別(每個實例會從1開始)? – 2012-03-01 21:50:34
'計數器'應該是實例級別 – sbell 2012-03-01 21:54:30
此相關的問題可能(或可能不會)有所幫助:http://stackoverflow.com/questions/7034063/adding-attributes-the-instancemethods-in-python – 2012-03-01 22:11:10