声明:我不认为这会使初始化更清洁。此外,如果您在计数器变量的某些用法中存在拼写错误,则不会得到NameError
,而是会默默创建并增加第二个计数器。请记住Python的禅:
显式比隐式更好。
说了这么多,你可以创建一个特殊的类,它会自动添加缺少的属性和使用这个类来创建和自动初始化各种计数器:
class Counter:
def __init__(self, default_func=int):
self.default = default_func
def __getattr__(self, name):
if name not in self.__dict__:
self.__dict__[name] = self.default()
return self.__dict__[name]
现在你可以创建一个单一的该类的实例可创建任意数量的相同类型的计数器。用法示例:
>>> c = Counter()
>>> c.foo
0
>>> c.bar += 1
>>> c.bar += 2
>>> c.bar
3
>>> l = Counter(list)
>>> l.blub += [1,2,3]
>>> l.blub
[1, 2, 3]
其实,这是类似于collections.defaultdict
做,除了你可以使用点符号访问计数器的,亦即c.foo
代替c['foo']
。试想想起来了,你甚至可以扩展defaultdict
,使整个事情更加简单:
class Counter(collections.defaultdict):
def __getattr__(self, name):
return self[name]
所以,应该把它初始化为'float'或'int'?或者'复杂',也许?如果你想数不止一件事情呢?你会如何重置比匿名,自我创建的计数器变量?这似乎是非常不切实际的。只需以正常的方式初始化它。 –