2016-08-14 2 views
0

Недавно я читал о магических методах в Python, которые делают код намного легче читать. Можем ли мы определить наши собственные сопоставления? Если да, есть ли указатель на это и насколько он будет сложным?Добавить собственное сопоставление магических методов

Например, + всегда отображается на __add__. Могу ли я определить отображение для ?, которое вызвало бы __is_valid__ в моем классе?

c = Car() 
print(c?) # invokes __is_valid__ of Car to get the result 
+0

Вы действительно пытаетесь изменить синтаксис python. Вопросительный знак не имеет особого значения. Для этого вам нужно изменить токенизатор в python, синтаксический анализ (например, определить приоритет), и это слишком много работает только для синтаксического сахара. Почему бы не использовать стандартный путь: print (c.is_valid())? Создание нового оператора не избавит вас от необходимости выполнять этот метод. c.is_valid может читать все сразу, c? что-то новое. – lofcek

+0

Или просто реализовать '@ property' и использовать' c.valid'. – jonrsharpe

+0

@jonrsharpe: Я не думаю, что это действительно дубликат этого другого вопроса. Этот вопрос задает вопрос о добавлении утверждений, и ответы попадают в генерацию байт-кода и прочее. Этот вопрос задает вопрос о создании новых операторов и сопоставлении их с магическими методами, что является несколько более ограниченной формой синтаксического изменения. (Я не удивлюсь, если там где-то есть реальный дубликат.) – BrenBarn

ответ

0

Вы, кажется, спрашиваете, можете ли вы создать свой собственный синтаксис в Python, добавив новые символы, которые реализованы с помощью магических методов. Ответ - нет. Доступны только те операторы, которые уже существуют (+, * и т. Д.), И каждый из них имеет соответствующие магические методы. Вы не можете добавлять новые.

+0

Хм .. Разумный. Это значит, что я тоже не могу изменить привязку. Значение + всегда будет вызывать '__add__', а не какой-либо другой настраиваемый метод' __some_impl__'. Это правильно ? – worldofprasanna

+0

@worldofprasanna: Верно. (Я имею в виду, что он может также называть '__radd__' или другие, которые он определен для вызова при определенных обстоятельствах, но правила того, какой магический метод каждый оператор вызывает, фиксированы, и вы не можете их изменить). – BrenBarn