Python определяет операторы [], len (), items () и keys () для пользовательского класса - PullRequest
0 голосов
/ 06 марта 2019

У меня есть некоторый код для определения класса, в котором основной сущностью является словарь.Например:

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])

Как определить функции-члены так, чтобы я мог использовать операторы [], len(), keys(), items() в экземпляре класса my_dict, как если быэто был словарь?

Ответы [ 3 ]

1 голос
/ 06 марта 2019

Попробуйте это

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()
1 голос
/ 06 марта 2019
#!/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
1 голос
/ 06 марта 2019

Вы можете продолжать делать то, что делаете, с помощью методов __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])

Обратите внимание, что вам следует создать экземпляр класса с круглыми скобками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...