Мне интересно, существует ли приемлемый способ передачи функций в качестве параметров объектам (т. Е. Для определения методов этого объекта в блоке init ).
Более конкретно, какМожно ли это сделать, если функция зависит от параметров объектов.
Кажется достаточно питоническим, чтобы передавать функции объектам, функции являются объектами, как и все остальное:
def foo(a,b):
return a*b
class FooBar(object):
def __init__(self, func):
self.func = func
foobar = FooBar(foo)
foobar.func(5,6)
# 30
Так что это работает,проблема проявляется, как только вы вводите зависимость от других свойств объекта.
def foo1(self, b):
return self.a*b
class FooBar1(object):
def __init__(self, func, a):
self.a=a
self.func=func
# Now, if you try the following:
foobar1 = FooBar1(foo1,4)
foobar1.func(3)
# You'll get the following error:
# TypeError: foo0() missing 1 required positional argument: 'b'
Это может просто нарушать некоторые святые принципы ООП в Python, и в этом случае мне просто придется сделать что-то еще, нотакже кажется, что это может оказаться полезным.
У меня есть несколько возможных способов обойти это, и мне интересно, какой (если таковой имеется) считается наиболее приемлемым.
Решение 1
foobar1.func(foobar1,3)
# 12
# seems ugly
Решение 2
class FooBar2(object):
def __init__(self, func, a):
self.a=a
self.func = lambda x: func(self, x)
# Actually the same as the above but now the dirty inner-workings are hidden away.
# This would not translate to functions with multiple arguments unless you do some ugly unpacking.
foobar2 = FooBar2(foo1, 7)
foobar2.func(3)
# 21
Будут признательны за любые идеи!