Рассмотрим следующий код:Использование functool.partialmethod и functool.partial?
import functools
import inspect
class Foo:
def foo_fn(self, hello, world):
print(hello, world)
class FooWrapper:
def __init__(self, foo_class):
self._foo = foo_class()
for key, value in inspect.getmembers(self._foo):
if inspect.ismethod(value):
bound_fn = functools.partial(self.foo_wrapper_fn, self, value)
setattr(self._foo, key, bound_fn)
def foo_wrapper_fn(self_wrapper, self_foo, bound_method, hello, world):
bound_method(hello, world)
def make_foo(Foo):
wrapper = FooWrapper(Foo)
return wrapper._foo
a = make_foo(Foo)
a.foo_fn("hello", "world")
Как это упорядочение функции
foo_wrapper_fn()
параметры, такие как(self_wrapper, self_foo, bound_method, hello, world)
приходят быть? и не так:self_wrapper, bound_fn, self_foo, hello, world
, так какself_wrapper
иbound_fn
были частично связаны сначала?Это нормально для возвращения
functool.partial
(а неfunctool.partialmethod
) называться объектом (a.foo_fn
)?Если я заменяю его
functools.partialmethod(self.foo_wrapper_fn, self, value)
, почему возникает эта ошибка?TypeError: 'partialmethod' object is not callable
Нет, он имел в виду, что он передается в Foo в качестве параметра конструктору. –
@ DannyStaple: проверьте, действительно. –
@ Danny Staple: передача класса здесь не требуется. в фактическом производственном коде я использую оболочку com, и я могу только создать экземпляр позже в другом контексте потока, где должны выполняться функции com. – goldcode