如何动态添加函数访问动态添加的属性

时间:2013-06-13 15:07:41

标签: python-2.7 dynamic-method

我有一个我添加动态属性的泛型类,我想动态地向实例添加方法,因为某些实例将有不同的方法,但是他们需要访问这些动态属性。

我该怎么做?

class GenericComponent:
    def __init__(self, ID):
        self.ID = ID

    @classmethod
    def addMethod(cls, func):
        return setattr(cls, func.__name__, types.MethodType(func, cls))

在我的逻辑中,当我构建这些通用组件时,我有类似的东西,因此对于不同的实例,我将使用相同的方法名称,但其中的逻辑是不同的。

            if t==0:
                def toString(target):
                   print "toString: ", target
                   attrs = vars(target)
                   print ', '.join("%s: %s" % item for item in attrs.items())              
                obj = GenericComponent(ID)
                obj.ID = ID
                obj.name = "some random name"
                obj.addMethod(toString)
                obj.toString()

不幸的是,当我致电obj.toString()时,它将看不到obj.name

1 个答案:

答案 0 :(得分:1)

您已将addMethod作为一种类方法。可以在实例上调用Python类方法,就像使用obj.addMethod(toString)一样,但在这种情况下,实例仅用于获取其类;传递给addMethod的第一个参数是obj的类。

然后,您的addMethod调用将函数作为其第二个参数(在此示例中为toString)传递给类绑定方法。然后,指令obj.toString()首先搜索toString的{​​{1}}属性;查找过程查找可以调用的类的属性。但是你调用的不是实例的绑定方法,而是类的绑定方法。然后使用类作为obj的值调用该方法,因此它打印类的属性,而不是实例的属性。

我不确定你到底要做的是什么,但也许这更接近你想要的东西:

target