Создать класс Python, который рассматривается как список, но с большим количеством функций? - PullRequest
3 голосов
/ 23 июня 2011

У меня есть класс с именем dataList. В основном это список с некоторыми metadata---myDataList.data содержит сам список (numpy), myDataList.tag содержит описание и т. Д. Я хотел бы, чтобы myDataList [42] возвращал соответствующий элемент myDataList. данные, и я хотел бы, чтобы Numpy и т. д. распознавали его как список (IE, numpy.asarray (myDataList) возвращает массив numpy, содержащий данные в myDataList). В Java это было бы так же просто, как объявить dataList, как реализовать интерфейс List, а затем просто определить необходимые функции. Как бы вы сделали это в Python?

Спасибо.

Ответы [ 3 ]

8 голосов
/ 23 июня 2011

Вы можете создать список подклассов и предоставить дополнительные методы:

class CustomList(list):
    def __init__(self, *args, **kwargs):
        list.__init__(self, args[0])

    def foobar(self):
        return 'foobar'

CustomList наследует методы обычных списков Python, и вы можете легко позволить ему реализовать дополнительные методы и / или атрибуты.

3 голосов
/ 23 июня 2011
class mylist(list):
    def __init__(self, *args, **kwargs):
        super(mylist, self).__init__(*args, **kwargs)       # advantage of using super function is that even if you change the parent class of mylist to some other list class, like your numpy list class, you won`t have to change the remaining code, which is what you would have to do incase of jena`s code snippet.
        # whatever meta data you want to add, add here
        self.tag = 'some tag'
        self.id = 3

    # you can also add custom methods
    def foobar(self):
        return 'foobar'

Теперь вы можете создать экземпляр mylist и использовать его как обычные списки с вашими дополнительными метаданными.

>>> a = mylist([1,2,3,4])
>>> a
[1,2,3,4]
>>> a[2] = 3                  # access normal list features
>>> a.append(5)               # access normal list features
>>> a
[1,2,3,4,5]
>>> a.tag                     # your custom meta data
'some tag'
>>> a.id                      # your custom meta data
3
>>> a.foobar()                # your custom meta data
'foobar'
>>> a.meta1 = 'some more'     # you can even add more meta data on the fly (which you cannot do in a regular list class)
>>> a.meta1
'some more'                   # your new meta data
2 голосов
/ 23 июня 2011

Определите __len__, __getitem__, __iter__ и, при необходимости, другие магические методы, составляющие тип контейнера .

Например, упрощенный диапазон реализация:

class MyRange(object):
   def __init__(self, start, end):
       self._start = start
       self._end = end
   def __len__(self):
       return self._end - self._start
   def __getitem__(self, key):
       if key < 0 or key >= self.end:
           raise IndexError()
       return self._start + key
   def __iter__(self):
       return iter([self[i] for i in range(len(self))])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...