0

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

我该怎么做呢?

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

4

1 回答 1

1

你已经创建了addMethod一个类方法。可以在实例上调用 Python 类方法,就像您在此处使用 所做的那样obj.addMethod(toString),但在这种情况下,实例仅用于获取其类;传递给的第一个参数addMethodobj.

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

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

class GenericComponent:
    def __init__(self, ID):
        self.ID = ID
    def addMethod(self, func):
        return setattr(self, func.__name__, types.MethodType(func, self))

def toString(target):
    print "toString: ", target
    attrs = vars(target)
    print ', '.join("%s: %s" % item for item in attrs.items())
ID = 'some ID'
obj = GenericComponent(ID)
obj.name = "some random name"
obj.addMethod(toString)
obj.toString()
于 2013-06-13T18:38:03.577 回答