如何绕过Python中的方法。。?
下面是一个场景 我有一个类(X)有一个方法xyz 我必须定义一个类(Y),它扩展类(X),但应该运行类Y的“xyz”,而不是类X的“xyz” 以下是一个例子:如何绕过Python中的方法。。?,python,Python,下面是一个场景 我有一个类(X)有一个方法xyz 我必须定义一个类(Y),它扩展类(X),但应该运行类Y的“xyz”,而不是类X的“xyz” 以下是一个例子: Code in first.py : class X(): def xyz(self): ----- Code in second.py: import first class Y(X): def xyz(self): ----- 实际上,我的要求是在调用“X.xyz()”时调用“Y
Code in first.py :
class X():
def xyz(self):
-----
Code in second.py:
import first
class Y(X):
def xyz(self):
-----
实际上,我的要求是在调用“X.xyz()”时调用“Y.xyz()”,我不能在“first.py”中进行修改,但我可以修改“second.py”
任何人都可以澄清这一点。您正在寻找monkeypatch 不要创建子类,直接在
X
上替换xyz
方法:
from first import X
original_xyz = X.xyz
def new_xyz(self):
original = original_xyz(self)
return original + ' new information'
X.xyz = new_xyz
替换整个类也是可能的,但需要提前完成(在其他模块导入该类之前):
转换类似于:
class X:
def xyz(self):
print 'X'
class Y(X):
def __init__(self,x_instance):
super(type(x_instance))
def xyz(self):
print 'Y'
def main():
x_instance = X()
x_instance.xyz()
y_instance = Y(x_instance)
y_instance.xyz()
if __name__=='__main__':
main()
这将产生:
X
Y
你到底想解决什么问题?另一个库是否已经使用了
X
对象,并且您需要替换该库上的xyz
方法?或者你的Y
类不仅仅是重写一个方法吗?只要避免在Y
中定义xyz()
,就会调用X.xyz()
。换言之,您可能想看一看,您是想在第三方库中将X
全部替换为Y
,还是只替换方法就足够了?或者你想在你自己的图书馆里使用Y
;用户希望在使用X
的实例时调用Y.xyz()。我想,你可以把X类的实例转换成Y类的实例,然后调用instance.xyz(),让它调用Y.xyz()@Dave:我在读原始问题。OP还不清楚他想做什么。我在问题下面的评论中特别询问了他试图解决的三种可能情况中的哪一种。@Dave:使用子类,调用Y().xyz()
只是三种情况之一。我同意@Dave的说法,这听起来像是一个典型的家庭作业OO问题。但这不是一个典型的家庭作业问题。这就留下了一个可能性,要么是一个真正的问题,要么是OP误解了他的作业。无论哪种情况,我们都必须回答实际提出的问题,而Martijn就是这样做的。
X
Y