【问题标题】:Python define the [], len(), items() and keys() operators for a custom classPython 为自定义类定义 []、len()、items() 和 keys() 运算符
【发布时间】:2019-07-28 03:44:42
【问题描述】:

我有一些代码来定义一个主要实体是字典的类。例如:

class MyDictionary:

    def __init__(self):
        self.__my_dict = {'a': 1,
                          'b': 2,
                          'c': 3}

    def __getitem__(self, item):
        return self.__my_dict[item]

    def __len__(self):
        return len(self.__my_dict)

    def keys(self):
        # ?

    def items(self):
        # ?

my_dict = MyDictionary
for key, value in my_dict.items():
    print([key, value])
for key in my_dict.keys():
    print(my_dict[key])

我应该如何定义成员函数,以便我可以在类实例 my_dict 上使用 []len()keys()items() 运算符,就好像它是字典一样?

【问题讨论】:

  • 我不明白这个问题。您清楚地知道如何定义必要的方法,看看您已经成功实现了__getitem____len__。我看不出是什么阻止您以类似的方式实施 keysitems
  • 以下链接可能对您有所帮助:stackoverflow.com/questions/4014621/…
  • @Aran-Fey 你完全正确。事实上,我之前已经尝试过了。出于某种原因,当时它不起作用,但现在它起作用了。我要检查它是否适用于我的“更大”程序。

标签: python dictionary operator-overloading


【解决方案1】:

您可以继续使用__getitem____len__ 方法做您正在做的事情,并将其余方法委托给__my_dict 的相应方法:

class MyDictionary:
    def __init__(self):
        self.__my_dict = {'a': 1,
                          'b': 2,
                          'c': 3}

    def __getitem__(self, item):
        return self.__my_dict[item]

    def __len__(self):
        return len(self.__my_dict)

    def keys(self):
        return self.__my_dict.keys()

    def items(self):
        return self.__my_dict.items()

my_dict = MyDictionary()
for key, value in my_dict.items():
    print([key, value])
for key in my_dict.keys():
    print(my_dict[key])

请注意,您应该用括号实例化一个类的对象。

【讨论】:

    【解决方案2】:

    试试这个

    def keys(self):
        return self.__my_dict.keys()
    
    def items(self):
        return self.__my_dict.iteritems() # python2.7
    
        return self.__my_dict.items() # python3
    

    另外,当你创建一个类的对象时,你应该使用括号

    my_dict = MyDictionary()
    

    【讨论】:

      【解决方案3】:
      #!/usr/bin/env python
      
      class MyDictionary:
          def __init__(self, my_dict):
              self.my_dict = my_dict
      
          def __getitem__(self, item):
              return self.my_dict[item]
      
          def __len__(self):
              return len(self.my_dict)
      
          def items(self):
              return self.my_dict.items()
      
          def keys(self):
              return self.my_dict.keys()
      
          def values(self):
              return self.my_dict.values()
      
      
      if __name__ == '__main__':
          d = {'a': 1,'b': 2,'c': 3}
          di = MyDictionary(d)
      
          print(di.__len__())
          print(di.items())
          print(di.keys())
          print(di.values())
          print(di.__getitem__('b'))
      

      输出:

      3
      dict_items([('a', 1), ('b', 2), ('c', 3)])
      dict_keys(['a', 'b', 'c'])
      dict_values([1, 2, 3])
      2
      

      【讨论】:

        猜你喜欢
        • 2013-08-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-11
        • 2012-08-06
        • 2015-04-10
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多