sta*_*art 1 python methods class dynamic instance
假设我有一个名单.我希望能够动态地将这些实例函数添加到类实例中.我知道类型.MethodType但我从这里到这里有点新手.基本上我想做的是:
class foo( object ):
def __init__(self):
pass
f = foo()
names = ["a","b","c"]
for name in names:
add name() to f # not sure what to do here
# what I wanted added to instance "f" is this for each name:
def name(self, *args, **kwargs):
print( "My name is %s" % inspect.stack()[0][3] )
print( "__called, args=%r, **kwargs=%r" % (args, kwargs) )
f.a() # ==> calls f.a()
f.b(1,2,3) # calls f.b(1,2,3 )and so on
Run Code Online (Sandbox Code Playgroud)
如果您将函数创建为嵌套函数,则更容易; name然后是从嵌套范围中获取的变量:
import types
def buildMethod(name, instance):
def namefunc(self, *args, **kwargs):
print "My name is %s" % name
print "__called, args=%r, **kwargs=%r" % (args, kwargs)
namefunc.__name__ = name
setattr(instance, name, types.MethodType(namefunc, instance, type(instance)))
f = foo()
names = ["a","b","c"]
for name in names:
buildMethod(name, f)
Run Code Online (Sandbox Code Playgroud)
这导致:
>>> f.a
<bound method instance.a of <__main__.foo instance at 0x100d8e560>>
>>> f.a.__name__
'a'
>>> f.a()
My name is a
__called, args=(), **kwargs={}
>>> f.b()
My name is b
__called, args=(), **kwargs={}
>>> f.c()
My name is c
__called, args=(), **kwargs={}
Run Code Online (Sandbox Code Playgroud)