覆盖导入的类

时间:2018-02-01 16:51:22

标签: python python-3.x inheritance

是否可以覆盖类的定义,以便所有调用(在我的程序或其他.py文件中)都会收到覆盖?例如:

# package.py
class orgClass:
    def some_method(x):
        return x * x

# my_prog.py
import other_package
from package import orgClass

class orgClass(orgClass):
    def some_method(x):
        return x + x

if __name__ == '__main__':
    other_package.run()

# other_package.py
from package import orgClass

def run():
    o = orgClass()
    x = 5
    print (o.some_method(x)) # would print 10 not 25; however it prints 25

我需要为这个特定的程序改变orgClass的实现,但是我不想改变原始包的源代码;无论如何似乎都是个坏主意所以我想我可以只是"重写" my_prog.py中的类实现会影响来自__main__.thread的所有调用。

3 个答案:

答案 0 :(得分:1)

你有几个选择。

选项1.您可以直接修改类对象(猴子修补):

import package

def new_some_method(self, x):
    return x + x

package.orgClass.some_method = new_some_method

(对此的变体包括对整个orgClass对象进行猴子修补,效果类似。)

选项2.您可以创建替换模块,然后修改sys.path以强制它先加载:

# replacement-packages/package.py
class orgClass:
    def some_method(self, x):
        return x + x

 # my_prog.py
 sys.path = ['path/to/replacement-packages'] + sys.path

 import package  # loads replacement-packages/package.py

(此处的变体包括在__init__.py中使用路径文件或各种垫片,或直接修改sys.modules。)

选项3.您可以分叉整个package项目,并根据您的需要进行修改。然后你可以使用virtualenv或其他一些设置只安装修改后的包作为my_prog程序的依赖项,而其他程序则使用默认的python解释器加载原包装。

答案 1 :(得分:-1)

如果我理解你想要的话 1)导入orgClass 2)调整orgClass

#my_classes.py
import orgClass

class orgClass(orgClass):
    def some_method(x):
        return x+x

编辑: 然后使用此功能使用

from my_classes import orgClass

编辑:

现在我看到你的导入是不同的,然后可以使用如下的参数来完成:

# package.py
class orgClass:
    def some_method(x):
        return x * x

# my_prog.py
import other_package
from package import orgClass

class orgClass(orgClass):
    def some_method(x):
        return x + x

if __name__ == '__main__':
    other_package.run(orgClass)

# other_package.py

def run(o):
    x = 5
    print (o.some_method(x)) # would print 10 not 25; however it prints 25

答案 2 :(得分:-1)

据我所知,您有两种选择:

  1. 修改原始文件package.py
  2. 制作需要新方法的每个文件导入my_prog.py
  3. 由于您不想要第一个选项,答案是否定的 - 您不能这样做。