重写Python脚本,在每个类中注入一个方法
假设我有一个名为 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"
但是我找不到不构建、修改然后再写回语法树的解决办法。