首页 > 解决方案 > 在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

标签: python

解决方案


好的,这是一个答案。

但首先要注意。这样做是个坏主意。通常我会说,编写一个测试套件,编写一个模块,测试模块(硬件不会在最轻微的接触下爆炸的地方?)然后应用。

从这个问题开始。您还需要functools.partial.

策略是编写额外的函数,就好像它们是方法一样,然后将它们修补到对象上。请注意,我使用的是 python 3,但这在 python 2 中应该可以正常工作。

我将制作两个模块。 base_class.pynew_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'

如果使用此方法无法重新加载,则上面的答案非常详细地说明了如何进行。


推荐阅读