2015-02-18 5 views
0

Да, я знаю, что даже название этого вопроса сбивает с толку. Извините, но это лучшее, что я могу описать, что я пытаюсь выполнить.Python - вызов функции экземпляра класса из другой функции?

Итак ... Я все еще участвую в работе с классами Python. Вот одна из них, с которой мне нужна помощь. В принципе у меня есть один класс, с которым я создаю секундомер. Тогда у меня есть куча функций вне этого класса, которые выполняют другие задачи, и у меня есть моя основная функция. Мне нужно запустить и остановить экземпляр класса stopwath из одной из функций, отличных от класса. Здесь есть уменьшенная версия, чтобы вы могли видеть мою структуру.

class StopWatch(Frame): 
    ... 
     def Start(self): 
       ...    
     def Start(self): 
       ... 
def dosomething(): 
      # right here I want to call the sw1.Start function in StopWatch. 
def dosomethingelse(); 
      # right here I want to call the sw1.Stop function in StopWatch. 
def main(): 
      sw1 = StopWatch(root) 

Я попытался сделать что-то подобное, но это не сработает.

class StopWatch(Frame): 
    ... 
     def Start(self): 
       ...    
     def Start(self): 
       ... 
def dosomething(): 
      # right here I want to call the sw1.Start function in StopWatch. 
      tmp = StopWatch 
      tmp.Start() 
def dosomethingelse(); 
      # right here I want to call the sw1.Stop function in StopWatch. 
      tmp = StopWatch 
      tmp.Start() 
def main(): 
      sw1 = StopWatch(root) 

Уверен, что это не работает, потому что я не являюсь экземпляром sw1 класса StopWatch.

Так как я могу назвать функции Start и Stop класса StopWatch, например sw1?

+0

Убедитесь, что они имеют доступ на 'sw1'. –

+0

Ну, это в значительной степени то, что я пытаюсь выяснить. Есть ли простой способ проверить это? – Husar

ответ

2

Довольно ясно, что у вас еще нет ручки на Python functions еще или концепция Scope. Поэтому я проведу вас через это, но, пожалуйста, прочитайте еще несколько уроков!

Вы определяете переменную sw1, экземпляр StopWatch класса, в объеме из main(). Он не будет доступен нигде вне main(). Следовательно, вам нужно пройти объект между методами. Это сделано мое сделать ваши dosomething() и dosomethingelse() методы принимают аргументы, например, так:

def doSomething(stopwatch): 
    # whatever comes first 
    stopwatch.start() 


def doSomethingElse(stopwatch): 
    # whatever comes first 
    stopwatch.stop() 

И тогда вы просто вызываете эти методы и передать их sw1, например, так:

def main(): 
    sw1 = StopWatch(root) 
    doSomething(sw1) 
    doSomethingElse(sw1) 
+0

Спасибо. Я буду искать дополнительную информацию о сфере, потому что это то, что меня пугает. Если бы doSomething (sw1) внутри main фактически выполнял экземпляр функции doSomething sw1? Я не хочу, чтобы это произошло. Это должно произойти как часть потока в doSomething. – Husar

+0

Прямо сейчас функция doSomething вызывается кнопкой. – Husar

+0

Если это так, тогда вы должны инкапсулировать 'doSomething()' и т. Д. Внутри другого класса и сделать 'sw1' переменной класса. Однако это немного похоже на сферу этого вопроса. Вы можете задать новый вопрос со всем контекстом своей проблемы, чтобы получить лучший ответ. – aruisdante