如何解决替换一个特定对象的类方法
假设类Man
在第三方文件中定义,该文件不能直接修改:
class Man:
def __init__(self,name):
self.name = name
def greet(self):
print(f"Hi,I'm {self.name}.")
我希望某些对象在调用greet
方法时表现不同。
例如,他们在问候时说“你好”而不是“嗨”。
第三方文件中有调用greet
的代码,我想更改其行为。
这是我所做的:
def another_greet(self):
print(f"Hello,I'm {self.name}.")
man = Man("Sue")
man.greet() # output: "Hi,I'm Sue"
man.greet = another_greet
man.greet() # TypeError: another_greet() missing 1 required positional argument: 'self'
man.greet(man) # output "Hello,I'm Sue"
但是,在替换man.greet = another_greet
之后,由于greet
参数不能随对象本身自动传递,因此无法用man.greet()
调用self
。我必须使用额外的显式参数来调用该方法,例如man.greet(man)
,但是我无法更改第三方文件中的man.greet()
。
直觉上我想有一种方法,也许需要another_greet
上的一些技巧?
继承确实可以在一定程度上解决问题。但是实际上,该对象不是由我声明的,而是由第三方函数提供的,因此我无法将其初始化为ModifiedMan。无论如何,确实可以用所有原始参数将其替换为另一个ModifiedMan对象,但是实际的类比Man复杂得多,并且不容易初始化,这样做会引入很多冗余代码。
解决方法
通过inheritance,您可以扩展Man
类的功能。
定义您自己的类,并继承Man
类。然后,您可以覆盖greet()
方法,新类的实例将使用greet()
class Man:
def __init__(self,name):
self.name = name
def greet(self):
print(f"Hi,I'm {self.name}.")
# This is the class that is inheriting Man.
class ModifiedMan(Man):
# Redefine the method that you want to override
def greet(self):
print(f"Hello,I'm {self.name}."
您可以阅读有关继承和多态性here的更多信息。
,在您的解决方案中,self
不会自动传递,因为another_greet
是 unbound函数,而greet
是 bound方法强>。 Python: Bind an Unbound Method?对这个问题有一些解决方案。
要解决您的原始问题,inheritance似乎是正确的解决方法;但是它还需要库提供所有扩展功能(从“使用”的角度来看)。如果不是这样 -并且您正在针对非生产用例进行此操作-您还可以像这样进行“猴子修补”:
from somewhere import Man
def greet(self):
print(f"Hello,I'm {self.name}.")
Man.greet = greet
我正在替换类级别本身的功能,因此它变成了绑定方法。我在开发环境中经常这样做(例如添加日志记录功能等)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。