Лямбда-функция для классов в python?

Должен быть простой способ сделать это, но каким-то образом я могу обвести вокруг себя голову. Лучший способ, которым я могу описать то, что я хочу, – это лямбда-функция для класса. У меня есть библиотека, которая ожидает в качестве аргумента необоснованной версии класса для работы. Затем он создает экземпляр класса, над которым он должен работать. Проблема в том, что я хочу иметь возможность динамически создавать версии класса, переходить в библиотеку, но я не могу понять, как это сделать, поскольку библиотека ожидает неизученной версии. В приведенном ниже коде описывается проблема:

class Double: def run(self,x): return x*2 class Triple: def run(self,x): return x*3 class Multiply: def __init__(self,mult): self.mult = mult def run(self,x): return x*self.mult class Library: def __init__(self,c): self.c = c() def Op(self,val): return self.c.run(val) op1 = Double op2 = Triple #op3 = Multiply(5) lib1 = Library(op1) lib2 = Library(op2) #lib3 = Library(op3) print lib1.Op(2) print lib2.Op(2) #print lib3.Op(2) 

Я не могу использовать общий класс Multiply, потому что сначала должен создать его экземпляр, который разбивает библиотеку «AttributeError: экземпляр Multiply не имеет метода вызова ». Не меняя класс библиотеки, есть ли способ сделать это?

5 Solutions collect form web for “Лямбда-функция для классов в python?”

Лямбды вообще не нужно. лямбда – это просто синтаксический сахар, чтобы определить функцию и использовать ее одновременно. Подобно тому, как любой лямбда-вызов может быть заменен явным def, мы можем решить вашу проблему, создав настоящий класс, соответствующий вашим потребностям и возвращающий его.

 class Double: def run(self,x): return x*2 class Triple: def run(self,x): return x*3 def createMultiplier(n): class Multiply: def run(self,x): return x*n return Multiply class Library: def __init__(self,c): self.c = c() def Op(self,val): return self.c.run(val) op1 = Double op2 = Triple op3 = createMultiplier(5) lib1 = Library(op1) lib2 = Library(op2) lib3 = Library(op3) print lib1.Op(2) print lib2.Op(2) print lib3.Op(2) 

Действительно ли библиотека указывает, что она хочет «неинициализированную версию» (т.е. ссылку на класс)?

Мне кажется, что библиотека действительно хочет объектную фабрику. В этом случае допустимо ввести:

 lib3 = Library(lambda: Multiply(5)) 

Чтобы понять, как работает лямбда, рассмотрите следующее:

 Multiply5 = lambda: Multiply(5) assert Multiply5().run(3) == Multiply(5).run(3) 

Это своего рода обман, но вы можете дать вашему классу __call__ метод __call__ который возвращает себя:

 class Multiply: def __init__(self,mult): self.mult = mult def __call__(self): return self def run(self,x): return x*self.mult 

Таким образом, когда библиотека вызывает c() она фактически вызывает c.__call__() который возвращает нужный объект.

 def mult(x): def f(): return Multiply(x) return f op3 = mult(5) lib3 = Library(op3) print lib3.Op(2) 

Если я правильно понимаю ваше проблемное пространство, у вас есть общий интерфейс, который принимает один аргумент, который вызывается с использованием класса Library . К сожалению, вместо того, чтобы вызывать функцию, Library предполагает, что функция завершена в класс с помощью метода run .

Вы можете создавать эти классы программно. Классы могут быть возвращены методами, и благодаря концепции замыканий вы должны иметь возможность обернуть любую функцию в классе, который соответствует вашим потребностям. Что-то вроде:

 def make_op(f): class MyOp(object): def run(self, x): return f(x) return MyOp op1 = make_op(lambda x: return x*2) op2 = make_op(lambda x: return x*3) def multiply_op(y): return make_op(lambda x: return x*y) op3 = multiply_op(3) lib1 = Library(op1) lib2 = Library(op2) lib3 = Library(op3) print( lib1.Op(2) ) print( lib2.Op(2) ) print( lib3.Op(2) ) 

Говоря об этом, изменение библиотеки для выполнения функции, а затем предоставление функций, вероятно, является более эффективным способом сделать это.

  • странное поведение с lamba: getattr (obj, x) внутри списка
  • Python: определение функций на лету
  • Эквивалент для лямбда-функций Python в Java?
  • lambda как аргумент для фильтра jinja2?
  • Поиск среднего списка
  • Команда Tkinter назначить кнопку в цикле с лямбдой
  • Вложенные области и Lambdas
  • Команды кнопки tkinter с lambda в Python
  • Проблемы с лямбдой Python
  • Индекс за пределами диапазона при использовании лямбда
  • Странное поведение лямбда в цикле
  •  
    Interesting Posts for Van-Lav

    Есть ли способ получить доступ к вложенным или повторно поднятым исключениям в python?

    Как использовать OR с помощью системы фильтров Django?

    Tensorflow вызывает протоколирование сообщений в два раза

    Поиск нескольких областей интереса в массиве

    Практический инструментарий GUI?

    При чтении файла на Python я столкнулся с ошибкой, которая произнесла UnicodeDecodeError. Что я могу сделать для устранения этой ошибки?

    Запись списков Python в столбцы в csv

    custom matplotlib plot: шахматная доска, как таблица с цветными ячейками

    UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0x92 в позиции 47: порядковый номер не в диапазоне (128)

    Django: как сохранить набор форм на основе двух моделей

    Расчет Python pi?

    Почему я не могу забрать трассировку ошибки в Python?

    Python: конвертирование («понедельник», «вторник», «среда») в «понедельник-среда»

    Найти системный жесткий диск с Python?

    В python, что означает параметр подчеркивания в функции

    Python - лучший язык программирования в мире.