Q:有没有办法改变Python(3.6)中现有对象的方法?(我所说的"方法"是指作为参数传递self
的函数.)
Example
比如说,我有一个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!
正如你所看到的,这个人的react 取决于他们当前的情绪,这个情绪是通过方法HasGoodMood()
计算出来的.当一个违约的人身上有超过10美元的现金时,他就会有好心情.
我可以很容易地创造出一个不在乎金钱、一直快乐的人:
>>> joe.HasGoodMood = lambda: True
>>> joe.SayHi()
Hello!
>>> joe.Cash = 0
>>> joe.SayHi()
Hello!
凉的请注意,Python如何知道,当使用HasGoodMood
的原始实现时,它会以静默方式传递self
作为第一个参数,但如果我将其更改为lambda: True
,它将调用不带参数的函数.问题是:如果我想为另一个也接受self
作为参数的函数更改默认值HasGoodMood
,该怎么办?
让我们继续我们的例子:如果我想创造一个贪婪的Person
人,只有当他们身上有超过Person
美元的钱时,他们才会快乐,那该怎么办?我想做一些类似的事情:
>>> greedy_jack = Person()
>>> greedy_jack.HasGoodMood = lambda self: self.Cash > 100
TypeError: <lambda>() missing 1 required positional argument: 'self'
不幸的是,这不起作用.还有其他方法可以改变方法吗?
Disclaimer:上述示例仅用于演示目的.我知道我可以使用继承权或保留现金门槛作为Person
人的财产.但这不是问题的重点.