python - 在python 2.7中重新加载一个类而不杀死obj
问题描述
我有一个班级和那个班级的对象。问题是当我必须对类方法进行更改时,我必须杀死对象并启动另一个对象。有没有办法在不杀死对象的情况下获得修改后的功能
Class ABC:
def abc():
print "Hello I am original text"
我称这个类为
import ABC
obj = ABC()
obj.abc() is printing the desired output
如果我想对方法 abc 进行更改或为类编写新方法,我必须重新打开 python shell 并拥有一个新的 obj。
我正在寻找一种可以再次重新加载类并且同一个对象将具有该类的新属性的方法
我正在使用 Python 2.7 并尝试了一些我得到的东西,比如 reload(module)
Giving negative rating is fine but there should be a reason for that. Just like if you don't have answer to that or does not understand it well, won't qualify you to give negative rating
解决方案
好的,这是一个答案。
但首先要注意。这样做是个坏主意。通常我会说,编写一个测试套件,编写一个模块,测试模块(硬件不会在最轻微的接触下爆炸的地方?)然后应用。
从这个问题开始。您还需要functools.partial
.
策略是编写额外的函数,就好像它们是方法一样,然后将它们修补到对象上。请注意,我使用的是 python 3,但这在 python 2 中应该可以正常工作。
我将制作两个模块。 base_class.py
和new_methods.py
。假设每个方法new_methods.py
都是在其他方法之后编写的,并且模块需要重新加载很多。
base_class.py:
class MyClass(object):
def __init__(self):
self.a = 'a'
self.b = 'b'
def show_a(self):
return self.a
新方法.py:
def first(obj):
return obj.b
def second(obj):
return obj.a + obj.b
def third(obj, number):
return obj.a + str(number)
口译员:
>>> from base_class import MyClass
>>> x = MyClass()
>>> x.show_a()
'a'
>>> import sys
>>> from functools import partial
>>> import new_methods as nm
>>> x.show_a = partial(nm.first, x)
>>> x.show_a()
'b'
>>> del sys.modules['new_methods'] # wrote some new stuff. want to import
>>> import new_methods as nm
>>> x.show_a = partial(nm.third, x)
>>> x.show_a(5)
'a5'
如果使用此方法无法重新加载,则上面的答案非常详细地说明了如何进行。
推荐阅读
- javascript - 如何让 Angular JS 在触发 ng-style 之前等待 $scope 变量被设置
- node.js - 如何运行多个 pm2 实例,每个实例都有不同的 cmd args?
- python - 如何在 python 中为 np.array 中的某个数字分配颜色?
- node.js - 如何从 nodejs 以编程方式设置环境变量?
- node.js - 如何在 linux 终端中将 URL 作为节点输入
- gitlab - 如何通过 Gitlab API 获取用户的组列表
- .net - 定义十进制属性 - 十进制 (18,2)
- java - 如何在文本中打印变量值
- c++ - C++中的多态和虚
- node.js - 如何使用 Mongoose 在 MongoDB 中查询“任何”?