2016-12-28 5 views
0

のpythonセメントには属性_meta、オブジェクトは、私はちょうどセメントアプリに与えられた文書を通じてつもりです私はPythonとセメントアプリに新しいですアプリの

を持っていないし、私は次の問題

Traceback (most recent call last): 
    File "/Users/Amith/python/learning/inter.py", line 80, in <module> 
    app.handler.register(MyHandler) 
    File "/Users/Amith/python/learning/connectors/lib/python2.7/site-packages/cement/core/handler.py", line 195, in register 
    if not hasattr(obj._meta, 'label') or not obj._meta.label: 
AttributeError: 'MyHandler' object has no attribute '_meta' 

に直面しています私はドキュメンテーションから多くの助けを捜していなかったし、他にもいくつかの人々を検証した。

すべてのヘルプは非常に

+0

参考 – amith

答えて

1

にappriciated問題はMyHandlerは、サブクラスCementBaseHandler正しくないということであるであろう

from cement.core.foundation import CementApp 
from cement.core.interface import Interface, Attribute 
from cement.core import interface 
from cement.core.handler import CementBaseHandler 

def my_validator(klass, obj): 
    members = [ 
     '_setup', 
     'do_something', 
     'my_var', 
     ] 
    interface.validate(MyInterface, obj, members) 

class MyInterface(Interface): 
    class IMeta: 
     label = 'myinterface' 
     validator = my_validator 
    # Must be provided by the implementation 
    Meta = Attribute('Handler Meta-data') 
    my_var = Attribute('A variable of epic proportions.') 

    def _setup(app_obj): 
     """ The setup function """ 

    def do_something(): 
     """  This function does something. """ 

class MyHandler(CementBaseHandler): 
    class Meta: 
     interface = MyInterface 
     label = 'my_handler' 
     description = 'This handler implements MyInterface' 
     config_defaults = dict(
      foo='bar' 
      ) 

    my_var = 'This is my var' 

    def __init__(self): 
     self.app = None 

    def _setup(self, app_obj): 
     self.app = app_obj 

    def do_something(self): 
     print "Doing work!" 


class MyApp(CementApp): 
    class Meta: 
     label = 'myapp' 
     define_handlers = [MyInterface] 
     handlers = [MyHandler] 

app = CementApp('myapp') 
# define interfaces after app is created 
app.setup() 
print app.config.keys('myapp') 
app.config.set('myapp', 'debug', True) 
print app.config.keys('myapp') 
app.handler.define(MyInterface) 
app.handler.register(MyHandler) 
app.run() 

以下の私のコードを見つけてください。任意の方法は、例えば... super()とサブ分類する必要があります

class MyHandler(CementBaseHandler): 
    class Meta: 
     interface = MyInterface 
     label = 'my_handler' 
     description = 'This handler implements MyInterface' 
     config_defaults = dict(
      foo='bar' 
     ) 
    my_var = 'This is my var' 

    def __init__(self, *args, **kw): 
     super(MyHandler, self).__init__(*args, **kw) 

     # add your code here (if necessary) 

    def _setup(self, app_obj): 
     super(MyHandler, self)._setup(app_obj) 

     # add your code here if necessary 

    def do_something(self): 
     print "Doing work!" 

お知らせsuper()を使用してMyHandler.__init__()MyHandler._setup()への変更...これは私のために問題を修正しました。

ご不便をおかけしましたことをお詫び申し上げます。ありがとうございます。ありがとうございます。私はGithubのプロジェクトに次のリリースで修正される問題を追加しました。 http://builtoncement.com/2.10/dev/interfaces_and_handlers.htmlから

+0

素晴らしいそれは動作します – amith

関連する問題