Как вызвать внешнюю функцию из класса - 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!