我正在从一个dict对象创建一个子类
class FeatureVector(dict):
def __init__(self, init_val=0):
super().__init__()
self.init_val = init_val
在这个类中,我尝试通过字典理解来自动分配一个函数,例如以下简化示例:
def load_fv(self, fvlist):
self = {k:float(val) for k, val in fvlist}
在此示例中,fvlist的构建方式如下:
fvlist = [["example", 1], ["feature", 2], ["vector", 3], ["list", 4]]
此load_fv方法无效。字典仍然为空:
{}
经过一番搜索,我发现这是因为
self
是不可变的,如此处所述:Why is `self` in Python objects immutable?所以也许我只是在尝试做一些我不应该做的事情。当然,可以使用for循环创建执行dict-comprehension的功能:
def load_fv(self, fvlist):
self.clear()
for x, y in fvlist:
self[x] = y
我仍然可以想象这样一种情况:在字典已经可用的情况下,或者当我想用字典初始化类似字典的对象时,将字典自动分配给字典子类的效率更高。
在这种情况下,我可以执行以下操作:
def __init__(self, init_dict, init_val=0):
super().__init__()
self.init_val = init_val
self.load_fv(fvlist)
def load_fv(self, fvlist):
self.clear()
if isinstance(fvlist, dict) or isinstance(fvlist, FeatureVector):
fvlist = [[key, val] for key, val in fvdict.items()]
for x, y in fvlist:
self[x] = y
但这并没有真正的优雅和实用性。有没有一种更好的单行/较少冗长的方式?
最佳答案
你有尝试过吗?
def __init__(self, init_dict, init_val=0):
super().__init__()
self.init_val = init_val
self.update(init_dict)
# Here init_dict is a dictionary or a dictionary like object
update
方法将提供的字典添加到自身。