2014-10-01 79 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

相關問題