Перегрузить * оператор в Python (или эмулировать его) - PullRequest
3 голосов
/ 15 марта 2012

Я хочу перегрузить оператор * в python.В C ++ вы можете перегрузить оператор разыменования, чтобы вы могли создать класс с пользовательским способом ответа на *alpha.

. Часть этого вопроса состоит в том, что я точно не знаю, и я имею в видуТочно, что делает оператор * (оператор распаковки, как я его называю).

Итак, как я могу его перегрузить или эмулировать его перегрузку.

В конце концов я хочу иметь возможность сделать: *alpha с пользовательским ответом и возвращаемым значением.


РЕДАКТИРОВАТЬ:

Я нашел решение благодаря комментарию Джо Кингтона.Поскольку *alpha распаковывает в соответствии с __iter__, я определил простой класс, от которого можно наследовать, чтобы разрешить это.

Кстати, причина, по которой я хочу это сделать, заключается в том, что я хотел довольноинтерфейс.

class Deref:
  def __deref__(self):
    pass

  def __iter__(self):
    yield self.__deref__()

class DerefTest(Deref):
  def __deref__(self):
    return '123cat'

if __name__ == '__main__':
  print(*DerefTest()) # prints '123cat'

В конце концов я просто остановился на использовании другого унарного оператора, потому что реализация, которую я дал, работает не во всех случаях, поэтому я разочарован.

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Не думаю, что вы правильно поняли унарные * и ** "операторы".

Они распаковывают список / dict в аргументы функции / аргументы ключевого слова. В этом контексте нет ничего другого, что имеет смысл. Таким образом, они не могут быть перегружены.

На самом деле их использование является синтаксической ошибкой где угодно, но не в объявлении / вызове функции.

0 голосов
/ 15 марта 2012

Вы имеете в виду

class Pointer(object):
    def __init__(self, pointee):
        self.pointee = pointee

    def deref(self):
        return self.pointee

- это не то, что вам нужно?

Не могли бы вы более точно указать, в чем заключается преимущество написания в виде *ptr вместо ptr.deref(), определенного выше

...