Python:在运行时重新定义类方法

时间:2014-06-03 09:54:59

标签: python

我已经定义了这样一个类:

class MyClass:
  def GetValue(self):
    return 5
  def PrintValue(self):
    print self.GetValue()

对于某些MyClass实例,我需要重新定义GetValue(),例如:

def GetAGoodValue(self):
  return 7

oneObject=MyClass()
oneObject.GetValue=GetAGoodValue
oneObject.PrintValue()

重新定义后,我得到了错误:

TypeError: not enough arguments; expected 1, got 0

如果在PrintValue方法中,我代之以编码:

print self.GetValue(self)

然后上面的代码可以工作,但仅适用于重新定义GetValue方法的那些MyClass实例。未重新定义GetValue方法的实例称错误为:

TypeError: too many arguments; expected 1, got 2

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果将方法分配给单个对象而不是更改整个类,则必须自己实现ususally-done绑定。

所以你有两个选择:

要么你做

oneObject.GetValue = lambda: GetAGoodValue(oneObject)

或者你“询问”函数对象如果被称为类属性它会做什么:

oneObject.GetValue = GetAGoodValue.__get__(oneObject, MyClass)

以便按预期工作。