在类中定义索引的python方法(使用“ []”)

时间:2019-01-21 04:08:37

标签: python class indexing methods

我了解到__add__可用于为新类定义+的用法。定义[]的用法等同于什么?

我想创建一个包含字典Parent的类codes,并且我想Parent[key]返回Parent.codes[key]

我知道我可能只使用Parent.codes[key],但是如果可以使用方法来避免类似+==之类的问题,这似乎是多余的。

2 个答案:

答案 0 :(得分:0)

您正在寻找的是:

def __getitem__(self, key):

编辑:

更具体地说,您想要的是:

def __getitem__(self, key):
   return self.Codes[key]

edit2:删除__iter____next__上的一些不相关的文本(请参见评论)

答案 1 :(得分:0)

您有很多选择。如果您要像dict这样的班级震撼,那么最好的办法最好是扩展dict而不是引用一个并尝试重定向所有方法:

class Parent(dict):
    # probably do something with the constructor, maybe

这将使您可以直接在Parent中建立索引,列出键,遍历值等。与此同时,您可以添加心中想要的任何其他属性,属性和方法。

您的问题的字面答案是__getitem____setitem____delitem__。您可以使用以下方法实现索引运算符的三个用例:

class Parent:
    def __init__(self, *args, **kwargs):
        self.codes = dict(*args, **kwargs)

    def __getitem__(self, key):
         return self.codes[key]

    def __setitem__(self, key, value):
         self.codes[key] = value

    def __delitem__(self, key):
         del self.codes[key]

Parent实例上调用方法的方式与Parent将它们重定向到dict的方式完全相同。

为将来参考,此处显示的方法(包括您的__add__示例)称为魔术,特殊或笨拙方法。解释器保留所有dunder(双下划线)属性。它们有多种用途,包括自定义对象中的运算符重载。 Python Data Model的文档中提供了(几乎)现有名称的完整规范。