2012-06-25 4 views
0

Я родом из ruby ​​/ C# и новичок в Python.Метод вызова Python вне класса

Я смотрю на следующий код:

def raiseFlag(): 
    global flag 
    flag = 1 

class TermStructureTest(): 

    def testImpliedObs(self): 
     global flag 
     flag = None 
     h = RelinkableYieldTermStructureHandle() 
     settlement = self.termStructure.referenceDate() 
     new_settlement = self.calendar.advance(settlement,3,Years) 
     implied = ImpliedTermStructure(h,new_settlement) 
     obs = Observer(raiseFlag) 
     obs.registerWith(implied) 
     h.linkTo(self.termStructure) 
     if not flag: 
      self.fail("Observer was not notified of term structure change") 

Почему это он работает, чтобы позвонить «raiseFlag» в пределах (класс TermStructureTest)?

+0

Но этот код * не * называют 'raiseFlag'. – kindall

+0

Это может не * вызвать * его, но он его использует. Для целей этого вопроса - незначительный каламбур. – tsm

+0

OP: ознакомьтесь с руководством по стилю Python (http://www.python.org/dev/peps/pep-0008/). С одной стороны, методы следует называть 'like_this', а не' likeThis' (случай с змеей вместо случая верблюда). – tsm

ответ

6

Функции, определенные на верхнем уровне, считаются определенными на уровне модуля (файла). Поэтому, если вы находитесь в одном файле, он доступен по всему миру.

Если вы находитесь в другом файле вам нужно

import foo #then use foo.raiseFlag() 

или

from foo import raiseFlag #use raiseFlag() 
+0

В частности: http://www.python.org/dev/peps/pep-3104/ для Python 3.x и http://www.python.org/dev/peps/pep-0227/ для Python 2.x –

+0

И это отличается от Ruby, правильно? – Wadstk