我有一个我添加动态属性的泛型类,我想动态地向实例添加方法,因为某些实例将有不同的方法,但是他们需要访问这些动态属性。
我该怎么做?
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
答案 0 :(得分:1)
您已将addMethod
作为一种类方法。可以在实例上调用Python类方法,就像使用obj.addMethod(toString)
一样,但在这种情况下,实例仅用于获取其类;传递给addMethod
的第一个参数是obj
的类。
然后,您的addMethod
调用将函数作为其第二个参数(在此示例中为toString
)传递给类的绑定方法。然后,指令obj.toString()
首先搜索toString
的{{1}}属性;查找过程查找可以调用的类的属性。但是你调用的不是实例的绑定方法,而是类的绑定方法。然后使用类作为obj
的值调用该方法,因此它打印类的属性,而不是实例的属性。
我不确定你到底要做的是什么,但也许这更接近你想要的东西:
target