聲明:我不認爲這會使初始化更清潔。此外,如果您在計數器變量的某些用法中存在拼寫錯誤,則不會得到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'?或者'複雜',也許?如果你想數不止一件事情呢?你會如何重置比匿名,自我創建的計數器變量?這似乎是非常不切實際的。只需以正常的方式初始化它。 –