Расширить функциональные возможности python для пользовательских классов - PullRequest
1 голос
/ 17 ноября 2011

Можно ли добавить dict-функциональность в созданные пользователем классы?

е:

class Foo(object):
    def __init__(self, x, y):
       self.x
       self.y
    def __dict__(self):
       return {'x': self.x, 'y': self.y}

f = Foo()
dict(f) <-- throws TypeError: iteration over non-sequence

1 Ответ

3 голосов
/ 17 ноября 2011

Конструктор dict ожидает либо отображение, либо итерацию пар ключ / значение в качестве параметра, поэтому вашему классу необходимо либо реализовать протокол отображения, либо быть итеративным.

Вот пример того, как получить последний подход:

class Foo(object):
    def __init__(self, x, y):
       self.x = x
       self.y = y
    def __iter__(self):
       return vars(self).iteritems()

Пример использования:

>>> dict(Foo(2, 3))
{'x': 2, 'y': 3}

Я не знаю, насколько это полезно. Вы могли бы просто сделать

>>> vars(Foo(2, 3))
{'x': 2, 'y': 3}

, который будет работать без реализации __iter__() в вашем классе.

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