Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何绕过Python中的方法。。?_Python - Fatal编程技术网

如何绕过Python中的方法。。?

如何绕过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

下面是一个场景

我有一个类(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.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