重写Python脚本,在每个类中注入一个方法

4 投票
3 回答
1221 浏览
提问于 2025-04-16 18:09

假设我有一个名为 foo.py 的 Python 模块,里面包含了一些代码:

class Foo(object):
    def __init__(self):
        pass

接下来,我想要解析这个脚本,并在它的每个类里面添加一个方法,把它改写成像这样:

class Foo(object):
    def __init__(self):
        pass
    def my_method(self):
        pass # do some stuff here

我注意到 Python 2.6 有一个叫 ast 的模块可以用来做这个,但不幸的是,我需要在 Python 2.5 中完成这个工作。欢迎任何建议。

3 个回答

1

你现在有这个脚本了吗?你应该可以直接修改它。为了满足你现在的需求,像下面这样就可以了:

class Foo(object):
    def my_method(self):
        pass

另外,你也可以定义一个叫 my method 的方法,然后把它作为一个属性添加到 Foo 类里:

def my_method(self):
    pass

Foo.my_method = my_method
#or
Foo.__dict__.my_method = my_method
2

我明白你想做什么,但如果你的源代码比较简单,或许你可以直接用正则表达式来解决问题,而不需要解析和重新写一遍。

可以试试这样的代码:

re.sub('^class\s+(\w+):\s*\n', 'class \\1:\n%s' % method_source, file_source, flags=re.M)

只要确保缩进正确就行了。

0

一个解决方案是:

class Foo(object):
    def __init__(self):
        pass

import new

def some_func(self):
    print "foobar"

Foo.my_method = new.instancemethod(some_func, None, Foo)

问题是,我不喜欢把新的方法定义加在文件的最后面。我希望生成的脚本中的类看起来像:

class Foo(object):
    def __init__(self):
        pass
    def my_method(self):
        print "foobar"

但是我找不到不构建、修改然后再写回语法树的解决办法。

撰写回答