Как вызвать внешнюю функцию из класса - python

Я пытаюсь собрать данные, которые анализируются через сокет. Вот мой код:

import pickle
import SocketServer

class SocketReciever(SocketServer.BaseRequestHandler):

    def handle(self):
        sint = self.request.makefile('rb')
        objectt = pickle.load(sint)
        #print(objectt)
        ParentClassCall(objectt)

if __name__ == "__main__":
    HOST, PORT = "localhost", 60

    # Create the server, binding to localhost on port 9999
    server = SocketServer.TCPServer((HOST, PORT), SocketReciever)
    # Activate the server; this will keep running until you
    # interrupt the program with Ctrl-C
    server.serve_forever()

data=[]
def ParentClassCall(currentdata):
    data.append(currentdata)

У меня вопрос, как бы я вызвал функцию ParentClassCall из класса SocketReciever?

Я знаю, что этот метод связан с проблемами безопасности, но он будет запущен на компьютере без доступа в Интернет.

2 ответа

Решение

Python никогда не добирается до определения ParentClassCall() так как он останавливается на линии server.serve_forever(), Определите функцию перед основным разделом.

Вот упрощенная версия вашего примера, чтобы продемонстрировать проблему:

class Foo(object):

  def __init__(self):
    pass

  def do_something(self):
    not_yet_defined_function()

if __name__ == "__main__":
  foo = Foo()
  foo.do_something()

def not_yet_defined_function():
  print "It worked!"

Результат тот же:

Traceback (most recent call last):
  File "tmp.py", line 11, in <module>
    foo.do_something()
  File "tmp.py", line 7, in do_something
    not_yet_defined_function()

Проблема в том, что вы пытаетесь получить доступ к функции до ее определения. Интерпретатор Python читает файл последовательно, выполняя команды по порядку. class а также def ключевые слова - это просто команды, которые создают (класс и функция) объекты. Итак, вы должны убедиться, что вы определили все свои объекты, прежде чем начать их использовать.

Изменяя пример, чтобы сначала определить функцию:

class Foo(object):

  def __init__(self):
    pass

  def do_something(self):
    not_yet_defined_function()

def not_yet_defined_function():
  print "It worked!"

if __name__ == "__main__":
  foo = Foo()
  foo.do_something()

Тогда вы получите желаемый результат:

lap:~$ python tmp2.py
It worked!
Другие вопросы по тегам