首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在扩展dict (在python3中)时正确覆盖方法键()

如何在扩展dict (在python3中)时正确覆盖方法键()
EN

Stack Overflow用户
提问于 2015-11-09 15:31:13
回答 3查看 1.8K关注 0票数 1

编辑:我增加了类和一些信息,看新的帖子。

我创建了一个扩展dictset的类(更确切地说,我扩展了collections.abc.MutableMappingMutableSet)。现在,我想正确地重写方法keys()

这个类表示一组其他对象,称为Measurand

代码语言:javascript
运行
复制
class Measurands(MutableSet, MutableMapping):
    @property
    def measurands(self):
        return self._measurands
    
    
    @measurands.setter
    def measurands(self, val):
        self._measurands = []
        
        for el in val:
            self.add(el)
    
    
    def __init__(self, arg=None):
        if arg is None:
            self.measurands = []
        else:
            try:
                measurands = arg.measurands
            except AttributeError:
                if isinstance(arg, Iterable):
                    measurands = list(arg)
                else:
                    measurands = [arg]
            
            self.measurands = measurands
            
    
    def __iter__(self):
        return iter(self.measurands)
    
    
    def __getitem__(self, key):
        for m in self:
            if m.id == key:
                return m
    
        raise KeyError(key)
    
    
    def __contains__(self, el_x):
        is_in = False
        
        for el in self:
            if el_x.id == el.id:
                is_in = True
                break
        
        return is_in
    
    
    def add(self, el):
        try:
            self[el.id].session_ids |= el.session_ids
        except KeyError:
            self[el.id] = Measurand(el)
    
    
    def _discard(self, key):
        res = False
        
        for i, m in enumerate(self):
            if m.id == key:
                del self.measurands[i]
                res = True
                break
        
        return res
    
    
    def __delitem__(self, key):
        res = self._discard(self, key)
        
        if not res:
            raise KeyError(key)
    
    def discard(self, key):
        self._discard(self, key)
    
    
    def remove(self, key):
        self.__delitem__(self, key)
    
    
    def __len__(self):
        return len(self.measurands)
    
    
    def __setitem__(self, key, value):
        res = False
        value_true = Measurand(value)
        
        for i, m in enumerate(self):
            if m.id == key:
                res = True
                
                if value.id == key:
                    self.measurands[i] = value_true
                else:
                    raise KeyError(key)
                
                break
        
        if not res:
            self.measurands.append(value_true)
    
    
    def __str__(self):
        string = "Measurands({"
        
        for m in self:
            string += str(m)
            string += ", "
        
        if string:
            string = string[:-2]
        
        string += "})"
        
        return string

问题在于keys返回Measurand对象的“列表”的默认方法。这不是我想要的。键应该是id对象的属性Measurand

现在,我返回一个简单的list,但我会返回一个dict_keyscollection.abc.KeysView对象。不幸的是,dict_keys不是一个全局名称。

  1. dict_keys在哪里?
  2. 这样做对吗?
EN

Stack Overflow用户

发布于 2015-11-09 17:33:30

Python3文档指出,dict.keys()返回值类型(即视图)是"set-like",因此您的返回值也应该是"set-like“。

dict.keys()、dict.values()和dict.items()返回的对象是视图对象。它们提供了字典条目的动态视图,这意味着当字典更改时,视图会反映这些更改。 可以迭代字典视图以生成它们各自的数据,并支持成员资格测试: …… 键视图是设置类似的,因为它们的条目是唯一的和可理解的。如果所有的值都是可选的,所以(键、值)对是唯一的和可选的,那么items视图也是一样的。(由于条目通常不是唯一的,所以值视图不被视为设置类。)对于类似集合的视图,为抽象基类collections.abc.Set定义的所有操作都是可用的(例如,==,<或^)。

全文:https://docs.python.org/3/library/stdtypes.html#dict-views

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33612542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档