是否可以覆盖类的定义,以便所有调用(在我的程序或其他.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
的所有调用。
答案 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)
据我所知,您有两种选择:
package.py
。my_prog.py
。由于您不想要第一个选项,答案是否定的 - 您不能这样做。