在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