我正在编写一个名为“Bag”的简单Python类:
class Bag:
def __init__(self, items=None):
if self.items == None:
self.items = defaultdict()
else:
temp_dict = defaultdict()
for key in self.items:
temp_dict[key] += 1
self.items = temp_dict
变量项包含对象列表,例如:
['d','a','b','d','c','b','d']
从那里,“def __init __(self,items = None)”将:
例如,这应该有效:
b = Bag()
缺少参数应该没问题,因为默认情况下项设置为 _None 。
但是,这总是引发异常(来自检查错误的脚本):
*Error: b = Bag() raised exception AttributeError: 'Bag' object has no attribute 'items'
我想初始化 Bag()而不在项中传递参数。
希望一切都清楚,告诉我是不是。
任何想法或代码有什么问题?
答案 0 :(得分:2)
from collections import defaultdict
class Bag(object):
def __init__(self, items=None):
self.items = items or list()
if not self.items:
self.items = defaultdict()
else:
temp_dict = defaultdict()
for key in self.items:
temp_dict[key] += 1
self.items = temp_dict
我做了一些更正:
1)创建self.items
并使用items
进行初始化
2)使用is None
或仅not self.items
与无比较,因为空列表评估为False
答案 1 :(得分:2)
'Bag' object has no attribute 'items'
表示:在Bag
方法的某个位置,您正在访问尚未定义的self.items
。
你的确如此。在构造函数中,您在之前编写:if self.items == None:
,然后创建第一个self.items
,从而创建它。
我认为这是一个错字,你的意思是if items is None:
,指的是参数。
但是,这段代码可以简化。我的看法:
import collections # Batteries included.
...
def __init__(self, items=None):
if not items: # Covers both None and empty list.
self.items = {}
else:
self.items = collections.Counter(items)
这可以进一步简化:
...
self.items = collections.Counter(items or [])
如果您严格要使用defaultdict
,则可以:
self.items = collections.defauldict(int, collections.Counter(items or []))
(请注意,没有参数的defaultdict()
没什么意义。)