python - 我希望能够动态地向 python 类添加函数,而事先不知道它们的名称

标签 python class dynamic methods instance

假设我有一个名字列表。我希望能够将这些作为实例函数动态地添加到类实例中。我知道 types.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

最佳答案

如果将函数创建为嵌套函数会更容易; 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)

这导致:

>>> 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={}

关于python - 我希望能够动态地向 python 类添加函数,而事先不知道它们的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650784/

相关文章:

python - 如何测试范围的等价性

生成元组列表的 Pythonic 方式

c++ - 错误动态数组

php - 如何根据最多 17 个不同的变量查询表?

javascript - 在 React 组件或该文件中定义函数的优点和缺点

javascript - vue.js 动态导入组件

python - 如何在 python pandas 中按自定义顺序排序?

python - 检查字符串是否以 django 模板中 'A' 和 'G' 之间的任何字母开头

Python 将元素添加到一个实例的列表中也会将其添加到另一个实例的列表中

c++ - 为什么映射的构造函数允许我们在参数中传递比较器对象?