我正在从一个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方法将提供的字典添加到自身。

09-10 06:01