Override method of class in another file

自古美人都是妖i 提交于 2019-12-13 09:12:01

问题


Say I have two files, file1.py and file2.py. In file1.py, I define two classes, one inherits from the other:

file1.py:

class Class1:
    def __init__(self):
        pass

    def func1(self):
        return "Hello world!"

class Class2(Class1):
    def __init__(self):
        pass

    def func2(self):
        return self.func1()

So now I'm able to call func1() and func2() from Class2.

file2.py:

import file1

class Class3(file1.Class2):
    def __init__(self):
        pass

Question: How can I change func1() from Class1 in file2.py, so that func2() in Class2 returns the same as func1()?

So not like this:

class Class3(file1.Class2):
    ...
    def func1(self):
        return "Another string"

回答1:


Would overriding func1 work?

class Class(file1.Class2):
    def func1(self):
        print "Class3.func1"

c = Class3()
c.func2()

Since func2 is not defined in Class3, Class2.func2 is called. However, in the body of that function, self is still an instance of Class3, so self.func1() calls Class3.func1, not Class1.func1. That is different from

d = Class2()
d.func2()

where self in Class2.func2 is an instance of Class2. Class2 does not define func1, so Class1.func1 is called.




回答2:


I think you want to monkeypatch Class1.func1.

c2 = Class2()
print(c2.func2())
Hello world!

def new_func1(self):
    return "Another string"

Class1.func1 = new_func1  # This is monkey patching.

print(c2.func2())
Another string

But this might break other code that uses Class1 or Class2.



来源:https://stackoverflow.com/questions/36824914/override-method-of-class-in-another-file

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!