ссылаясь на себя изнутри себя в питоне - PullRequest
0 голосов
/ 26 августа 2011

Я даже не уверен, что заголовок моего вопроса правильный, но я все равно уйду.Но я хотел бы извиниться, если окажется, что название не совсем правильное.Кроме того, я должен признать, что я не гуру в том, что касается python, поэтому, если мой вопрос глуп, просто посмейтесь!

Я определил класс python, который использует код.модуль переводчика.(В основном я пытаюсь написать примитивную консоль.) Я могу передать строки интерпретатору, и все работает нормально.Однако я хотел бы выполнить синтаксический анализ строк вне этого класса, поэтому я попытался передать строку, которую я прочитал, из командной строки моей функции синтаксического анализатора, которая, в свою очередь, возвращает строку.(Он расширяет исходную строку в допустимый оператор python.) Я беру эту строку и передаю ее интерпретатору.Это все еще работает отлично.Однако, когда возвращаемая строка содержит ссылку на функцию, определенную в моем исходном классе, она ломается, и python жалуется, что self.whthing не определен.Возможно, следующий фрагмент мог бы прояснить ситуацию

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.whither, потому что функция do_something работает с одним из членов класса в myclass.

Спасибо,

Золтан

Ответы [ 3 ]

3 голосов
/ 26 августа 2011

Измените эту часть:

def self.do_something( self ):
    print 'I have done something'

на просто:

def do_something( self ):
    print 'I have done something'

Когда вы вызываете метод, вы используете self.some_method ().Когда вы определяете его, вы просто определяете его с помощью параметра self, который будет неявно передан.

EDIT :

Вам также нужно указать свой ИнтерактивНебольшая помощь интерпретатора, чтобы сказать ему, в каком контексте он должен работать, передавая localals ():

измените это:

code.InteractiveInterpreter.runsource( parsed_line )

на что-то вроде этого:

interpreter = code.InteractiveInterpreter(locals())
interpreter.runsource( parsed_line )
2 голосов
/ 26 августа 2011

self не волшебство в Python, как в некоторых других языках;он просто традиционно используется в качестве первого параметра для вызовов метода экземпляра, поскольку экземпляр передается методу в качестве этого параметра.Он не имеет смысла в объявлении класса, только в теле метода экземпляра.

0 голосов
/ 26 августа 2011

Если ваш класс C фиксированный, вы можете вызвать метод как

Myclass.do_something(self)

Но это не очень хороший стиль.В чем причина вызова функции за пределами ???

Вы можете определить

def parse_something(obj, line):
    obj.do_something()

Не могли бы вы уточнить, что вы хотите сделать?Я думаю, что есть лучший, более объектно-ориентированный способ сделать это.

...