【发布时间】:2015-07-16 23:06:25
【问题描述】:
我使用functools.partial 来创建一个闭包,使用setattr 来制作可以从类实例中调用。这里的想法是在运行时创建一组方法。
#!/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 会将s 的当前值绑定到dummy 的第一个参数,这将释放self 以在从实例调用它时传递。
它没有按我的预期工作
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)
是否可以动态创建作为闭包但可从类的实例调用的方法?
【问题讨论】:
-
@alfasin 该问题询问有关向特定实例添加方法的问题;我的问题是关于向类中添加方法,以供所有实例继承
-
是的,但接受的答案显示了如何做到这两点
标签: python class methods closures