gpt4 book ai didi

python - 在 Python 中将 functools.partial 设置为实例方法

转载 作者:行者123 更新时间:2023-12-01 09:54:21 24 4
gpt4 key购买 nike

我正在使用 functools.partial创建一个闭包,并使用 setattr to make 可以从类实例中调用。这里的想法是在运行时创建一组方法。

#!/usr/bin/python
from functools import partial

class MyClass(object):

def __init__(self, val):
self.val = val

@classmethod
def generateMethods(self):
def dummy(conf1, self):
print "conf1:", conf1
print "self.val:", self.val
print

for s in ('dynamic_1', 'dynamic_2'):
closed = partial(dummy, s)
setattr(self, "test_{0}".format(s), closed)

在我看来 partial将绑定(bind) s 的当前值至 dummy的第一个参数,这将释放 self当从实例调用 this 时传递。

它没有按我的预期工作
if __name__ == '__main__':
# Dynamically create some methods
MyClass.generateMethods()

# Create an instance
x = MyClass('FOO')

# The dynamically created methods aren't callable from the instance :(
#x.test_dynamic_1()
# TypeError: dummy() takes exactly 2 arguments (1 given)

# .. but these work just fine
MyClass.test_dynamic_1(x)
MyClass.test_dynamic_2(x)

是否可以动态创建作为闭包但可从类的实例调用的方法?

最佳答案

我认为新的 functools.partialmethod 适用于这个确切的用例。

直接来自文档:

>>> class Cell(object):
... def __init__(self):
... self._alive = False
... @property
... def alive(self):
... return self._alive
... def set_state(self, state):
... self._alive = bool(state)
... set_alive = partialmethod(set_state, True)
... set_dead = partialmethod(set_state, False)
...
>>> c = Cell()
>>> c.alive
False
>>> c.set_alive()
>>> c.alive
True

关于python - 在 Python 中将 functools.partial 设置为实例方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31466022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com