2014-10-01 85 views
-1

我需要使用不同类(不同文件)中的类中的函数,并且遇到问题,不确定如何完成此操作,并且正努力尝试查找帮助我寻找什么(我可能会使用错误的条款)。在另一个类的方法中使用类中的方法python

Directory Structure: 
--app 
    --static 
    --js 
    --templates 
    --main_page.html 
    --__init__.py 
    -- MainApp.py 
    --settings.py 
server.py 

server.py:

from gevent import monkey 
from socketio.server import SocketIOServer 

from app import app 
monkey.patch_all() 
listen_address = '0.0.0.0' 
listen_port = 5000 
print 'Starting Server on: http://{0}:{1}'.format(listen_address, listen_port) 
SocketIOServer((listen_address, listen_port), app, resource="socket.io").serve_forever() 

应用>初始化的.py

from flask import Flask 
from flask import render_template 
from flask import request 
from socketio import socketio_manage 
import settings 
from celery import Celery 
from redis import Redis 
import subprocess 
import requests 
from socketio.namespace import BaseNamespace 


def make_celery(app): 
    celery = Celery(app.import_name, broker=app.config['CELERY_BROKER_URL']) 
    celery.conf.update(app.config) 
    TaskBase = celery.Task 
    class ContextTask(TaskBase): 
     abstract = True 
     def __call__(self, *args, **kwargs): 
      with app.app_context(): 
       return TaskBase.__call__(self, *args, **kwargs) 
    celery.Task = ContextTask 
    return celery 



app = Flask(__name__) 
app.debug = True 
app.config.from_object(settings) 
celery = make_celery(app) 
r_server = Redis('localhost') 

@app.route('/socket.io/<path:remaining>') 
def socket(remaining): 
    socketio_manage(request.environ, {'/testclass': TestClass}, request) 
    return 'done' 


@app.route('/') 
def main_page(): 
    return render_template('main_page.html') 

class TestClass(BaseNamespace): 
    def on_submit(self, data): 
     #start mainapp 
     import MainApp 
     MainApp.MainApp() 

    @celery.task(name='tasks.emitter') 
    def emitter(self, string): 
#   emit to receive function in javascript... javascript pulls the 'mytext' field which contains (string) 
     self.emit('receive', {'mytext': string}) 
    from socketio.namespace import BaseNamespace 
    import MainApp 

MainApp.py

import app 

class MainApp(app.TestClass): 

    def __init__(self): 
    self.emitter(self, 'test1234') 

我怎么能使用self.emit从TestClass in Mainapp?发射器功能运行self.emit发送一个字符串使用的WebSockets的JavaScript代码...我不断收到错误,如下面...

TypeError: emitter() takes exactly 2 arguments (1 given) 

或以上的情况下...

Traceback (most recent call last): 
    File "/.../.../.../lib/python2.7/site-packages/gevent/greenlet.py", line 327, in run 
    result = self._run(*self.args, **self.kwargs) 
    File "/.../.../.../lib/python2.7/site-packages/socketio/virtsocket.py", line 403, in _receiver_loop 
    retval = pkt_ns.process_packet(pkt) 
    File "/.../.../.../lib/python2.7/site-packages/socketio/namespace.py", line 155, in process_packet 
    return self.process_event(packet) 
    File "/.../.../.../lib/python2.7/site-packages/socketio/namespace.py", line 225, in process_event 
    return self.call_method_with_acl(method_name, packet, *args) 
    File "/.../.../.../lib/python2.7/site-packages/socketio/namespace.py", line 240, in call_method_with_acl 
    return self.call_method(method_name, packet, *args) 
    File "/.../.../.../lib/python2.7/site-packages/socketio/namespace.py", line 282, in call_method 
    return method(*args) 
    File "/.../.../.../.../app/__init__.py", line 50, in on_submit 
    MainApp.MainApp() 
    File "/.../.../.../.../app/MainApp.py", line 11, in __init__ 
    self.emitter(self, 'test1234') 
    File "/.../.../.../lib/python2.7/site-packages/celery/local.py", line 167, in <lambda> 
    __call__ = lambda x, *a, **kw: x._get_current_object()(*a, **kw) 
    File "/.../.../.../.../app/__init__.py", line 24, in __call__ 
    return TaskBase.__call__(self, *args, **kwargs) 
    File "/.../.../.../lib/python2.7/site-packages/celery/app/task.py", line 420, in __call__ 
    return self.run(*args, **kwargs) 
    File "/.../.../.../.../app/__init__.py", line 55, in emitter 
    self.emit('receive', {'mytext': string}) 
    File "/.../.../.../lib/python2.7/site-packages/socketio/namespace.py", line 451, in emit 
    endpoint=self.ns_name) 
AttributeError: 'MainApp' object has no attribute 'ns_name' 
<Greenlet at 0x1120ad0f0: <bound method Socket._receiver_loop of <socketio.virtsocket.Socket object at 0x111c7c5d0>>> failed with AttributeError 

谢谢!

+2

你会得到什么错误? – Kevin 2014-10-01 18:10:38

+0

什么是“发射器”?这些类如何使用? – BrenBarn 2014-10-01 18:12:36

+0

你的主要方法在哪里?代码运行的顺序是什么? – sheeptest 2014-10-01 18:28:39

回答

0

我建议你明确地创建一个classA的实例,以免混淆。

@classmethod 
@celery.task(name='tasks.emitter') 
def emitter(cls, string): 
    cls.emit('receive', {'mytext': string}) 


class MainApp(object): 
    def __init__(self,emitter): 
     self.emitter = ClassA.emitter 
     self.emitter('string') 
+0

当我做第一个选择时,我得到以下内容:TypeError:__init __()至少需要3个参数(1给出) – user1601716 2014-10-01 18:51:32

+0

看起来像你实例化发射器采取额外的参数: 'self.emitter(self,'test1234' )' 只是需要 'self.emitter('test1234')' – 2014-10-01 19:14:26

+0

这是正确的,但我不能访问发射不使用'self.emit',我不能访问自己没有初始化它就像那样。我怎样才能访问排放没有这样做? – user1601716 2014-10-01 19:27:34

0

没有问题,在这里与它在另一个类是:

class MainApp(object): 
    def __init__(self,emitter): 
     self.objA = ClassA() 
     self.emitter = self.objA.emitter 
     self.emitter('string') 

你也可以,如果需要共享使它成为一个类的方法,或者一个单独的函数。您的MainApp类继承自TestClass,因此您完全可以通过​​来引用该方法。

唯一的问题是要传递self两次:任何方法调用,不管是继承与否,自动将self参数,所以你只需要通过另一种说法:

self.emitter('test1234') 
+0

当我这样做时,我得到的错误:发射器()只需要2个参数(1给出) – user1601716 2014-10-01 19:00:58

0

看起来你正试图做他的后退。

符合条件:您需要定义emit(someStr,someDict)某处。

您的MainClass需要扩展ClassA。

假设你有class_a.py和main_app.py

main_app.py

from class_a import ClassA 

class MainApp(ClassA): 
    ## now you can call any method from ClassA 
    self.emitter(someArg) 

注意:您不需要MainApp.MainApp(self.emitter)在ClassA的,因为MainApp扩展ClassA。

+0

TypeError:发射器()只需要2个参数(给出1) – user1601716 2014-10-01 19:23:49

+0

发射器需要声明为'def emitter(self,someArg )'然后称为self.emitter(someArg)。 'self'也会自动作为第一个参数传递。如果你在没有任何参数的情况下调用emitter(),python仍然会传递'self'作为参数,从而破坏你的代码,因为现在你在技术上需要传递一个arg。 – keda 2014-10-01 19:44:54

+0

是有道理的,但当我这样做时,我得到以下... TypeError:__init __()只需要1个参数(4给出) >> TypeError – user1601716 2014-10-01 19:55:09

相关问题