2014-11-28 2 views
1

Я пытаюсь подражать чему-то, называемому «префиксным деревом» в Python.Перегрузка операторов для пользовательских типов в Python

Мой класс имеет метод __contains__, так что я могу проверить, если дал слово в этом дереве:

class PrefTree(): 
    ... 
    def __contains__(self, word): 
     #some code... 
    ... 

pt = PrefTree() 
... 
w = "someword" 
if w in pt: 
    print("Aye, found it.") 

Но я также хотел бы иметь какой-то особый __contains__ метод проверки членства с помощью специального правила. Поэтому мне нужно «другое» in, чтобы проверить членство с этим методом. Каков наилучший способ реализовать это?

+1

Не уверен, что я понимаю ваш вопрос. Вы не можете создавать новые операторы. Существует только один оператор 'in', и вы можете перегрузить его, чтобы сделать одно (за класс). Если у вас есть другой тип проверки, вы можете использовать другой существующий оператор или просто дать вашему классу метод, чтобы люди вызывали 'obj.specialContains (что угодно)'. – BrenBarn

+0

Это правда, я могу добавить метод для этого, но, на мой взгляд, это выглядело бы намного лучше и более питонично, если бы я мог сделать 'if w special_in pt' –

+0

Ну, вы не можете. Вы не можете определить своих собственных операторов; вы можете определить поведение для существующих операторов. – BrenBarn

ответ

0

Является ли только один из вариантов использования __contains__, который должен применяться для данного w? и затем, что определяет, применяется ли специальное правило или стандарт? (некоторая характеристика w?)

Если оба пользователя должны быть всегда доступны для пользователей вашего класса для любых w, то, очевидно, вам нужны два разных метода.

Если, однако, кое-что о w определяет реализацию в использовании, вы можете определить суперкласс PrefixTree - PrefixTreeBase, скажем - содержащий реализацию по умолчанию __contains__, а затем реализация PrefixTree будет выглядеть следующим образом:

def __contains__(self, w): 
    if self._is_special(w): 
     return self._special_rule(w) 
    return super().__contains__(w) 

, где методы _*special* реализуют ваши представления об особой природе.

Смежные вопросы