Есть ли элегантный способ создать подкласс списка Python, который сохраняет свой подкласс при добавлении, нарезке и т.д.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли элегантный способ создать подкласс списка Python, который сохраняет свой подкласс при добавлении, нарезке и т.д.

Сообщение Anonymous »

Я хочу расширить функциональность стандартного списка, создание подклассов кажется очевидным способом. На самом деле я использую это для хранения математического выражения в обратной польской нотации (RPN) для проекта генетического программирования.

Код: Выделить всё

class RPN(list):
def evaluate(self, vars):
# evaluate the RPN expression
pass

def to_infix(self):
# convert to infix form
pass

@staticmethod
def from_infix(expr):
# create new RPN object from infix expression sting
pass
Это отлично работает, я могу создать объект RPN, например RPN([5, 6,operator.add, 7, 8,operator.add,operator.mult]) , и он работает так, как задумано.
Моя проблема в том, что я хочу выполнять с этими объектами RPN операции, подобные спискам, такие как добавление, сложение, разрезание и т. д., но когда я это делаю они возвращаются к обычным старым спискам (кроме добавления - это нормально).
Итак, например:

Код: Выделить всё

rpn1 = RPN([5, 6, operator.add])
rpn2 = RPN([7, 8, operator.add])
rpn3 = rpn1 + rpn2
# type(rpn3) == list
rpn4 = rpn1[0:1]
# type(rpn4) == list
Я могу понять, почему, потому что создается новый объект, и он создает его в виде списка. Полагаю, я могу изменить это поведение, но тогда мне придется предоставить новые реализации для __add__, методов нарезки и т. д. И вдруг я пишу гораздо больше кода, чем предполагал. В качестве альтернативы я могу каждый раз переделывать все как объект RPN, например. rpn3 = RPN(rpn1 + rpn2), но это тоже кажется неуклюжим.
Есть ли лучший способ?
Обратите внимание, это Вопрос был помечен как дубликат вопроса «Как использовать понимание списка в производном классе списка». В отмеченном сообщении задавался вопрос о том, как использовать понимание списков внутри производного класса списка (и странным образом, переназначая переменную self внутри функции __init__), я спрашиваю о чем-то совершенно другом. Так уж получилось, что обе проблемы решаются с помощью Collections.UserList, но сами вопросы, ИМХО, не являются дубликатами.

Подробнее здесь: https://stackoverflow.com/questions/791 ... class-when
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»