问: 有没有办法改变 Python (3.6) 中现有对象的方法? (“方法”是指作为参数传递的函数 self
。)
例子
假设我有一个类 Person
有一些非常有用的方法 SayHi()
:
class Person(object):
Cash = 100
def HasGoodMood(self):
return self.Cash > 10
def SayHi(self):
if self.HasGoodMood():
print('Hello!')
else:
print('Hmpf.')
>>> joe = Person()
>>> joe.SayHi()
Hello!
如您所见,此人的反应取决于他们当前的情绪,该情绪由方法 HasGoodMood()
计算得出。违约者只要身上有超过 10 美元的现金,就会心情愉快。
我可以很容易地创造一个不在乎钱并且一直快乐的人:
>>> joe.HasGoodMood = lambda: True
>>> joe.SayHi()
Hello!
>>> joe.Cash = 0
>>> joe.SayHi()
Hello!
凉爽的。请注意 Python 如何知道在使用 HasGoodMood
的原始实现时,它会默默地传递 self
作为第一个参数,但是如果我将它更改为 lambda: True
没有参数的函数。问题是:如果我想为另一个也接受 self
作为参数的函数更改默认值 HasGoodMood
怎么办?
让我们继续我们的例子:如果我想创建一个贪婪的 Person
谁只有超过 100 美元才会快乐?我想做类似的事情:
>>> greedy_jack = Person()
>>> greedy_jack.HasGoodMood = lambda self: self.Cash > 100
TypeError: <lambda>() missing 1 required positional argument: 'self'
不幸的是,这不起作用。还有其他方法可以改变方法吗?
免责声明: 以上示例仅用于演示目的。我知道我可以使用继承或保留现金阈值作为 Person
的属性。但这不是问题的重点。
原文由 Jan Kukacka 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用一些提示:
是否可以在不更改同一类的所有其他实例的情况下更改实例的方法实现?
您可以执行以下操作,方法是使用类型模块将方法分配给创建的对象而不影响类。您需要这样做,因为函数不会自动接收 self 对象作为第一个变量,但方法会。