在python中引用self中的self

时间:2011-08-25 20:01:45

标签: python parsing interpreter interactive self

我甚至不确定我的问题标题是否正确,但无论如何我都会开火。但我想道歉,如果事实证明标题不完全正确。另外,我不得不承认,就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中的一个类成员上运行。

谢谢,

佐尔坦

3 个答案:

答案 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()

你能详细说明你想做什么吗?我认为有更好,更多 面向对象的方式来做到这一点。