我甚至不确定我的问题标题是否正确,但无论如何我都会开火。但我想道歉,如果事实证明标题不完全正确。另外,我不得不承认,就python而言,我不是一个大师,所以如果我的问题很愚蠢,那就大笑吧!
我已经定义了一个使用code.interpreter模块的python类。 (基本上,我正在尝试编写一个原始控制台。)我可以将字符串传递给解释器,一切正常。但是,我想在这个类之外进行字符串解析,所以我试图将我从命令行读取的字符串传递给我的解析器函数,然后返回一个字符串。 (它将原始字符串扩展为有效的python语句。)我接受此字符串,并将其传递给解释器。这仍然很好。但是,当返回的字符串包含对我原始类中定义的函数的引用时,它会中断,并且python会抱怨self.whatever未定义。也许,以下片段会让事情变得更清晰
class myclass():
...
parsed_line = parser.parse_line('line to parse')
code.InteractiveInterpreter.runsource( parsed_line )
def self.do_something( self ):
print 'I have done something'
pass
和我的外部功能
def parse_line( line ):
if 'line' = 'line to parse'
return 'self.do_something()'
好吧,它会破裂。如果我将解析器修改为
def parse_line( line ):
return 'print 12'
它可以正常工作,并且愉快地打印12.实际上,对self.do_something的引用并不重要。即使我试图简单地分配给self.a,它仍然会破坏。
我的问题是,如何克服上述问题?我真的必须引用self.whatever,因为函数do_something在myclass中的一个类成员上运行。
谢谢,
佐尔坦
答案 0 :(得分:3)
更改此部分:
def self.do_something( self ):
print 'I have done something'
只是:
def do_something( self ):
print 'I have done something'
调用方法时,使用self.some_method()。定义它时,只需使用参数self
定义它,它将被隐式传入。
编辑:
您还需要通过传入locals()来为您的Interactive Interpreter提供一些帮助,告诉它应该运行的上下文:
改变这个:
code.InteractiveInterpreter.runsource( parsed_line )
这样的事情:
interpreter = code.InteractiveInterpreter(locals())
interpreter.runsource( parsed_line )
答案 1 :(得分:2)
self
在Python中并不神奇;它通常仅用作实例方法调用的第一个参数,因为实例作为此参数传递给方法。它在类声明中没有意义,只在实例方法的主体内。
答案 2 :(得分:0)
如果您的C类已修复,您可以将该方法称为
Myclass.do_something(self)
但这不是好风格。在外面调用函数的原因是什么?
您可以定义
def parse_something(obj, line):
obj.do_something()
你能详细说明你想做什么吗?我认为有更好,更多 面向对象的方式来做到这一点。