多くの Spyne の例で、すべてのメソッドが典型的なself
パラメーターを持っていないことを見てきました。self
パラメータを使用した Spyne の例はありませんcls
。それらはctx
パラメーターを使用しますがctx
、インスタンスもクラスも参照しません (そして、何らかの状態を維持する必要があります)。
それを使用することは可能ですか?または、クラスはインスタンス化されておらず、静的クラスとして使用されていますか?
私は次のようなことをしようとしていました:
# -*- coding: utf-8 -*-
from __future__ import (
absolute_import,
unicode_literals,
print_function,
division
)
from spyne.decorator import rpc
from spyne.service import ServiceBase
from spyne.model.primitive import String
class RadianteRPC(ServiceBase):
def __init__(self, name):
self._name = name
@rpc(_returns=String)
def whoami(self):
"""
Dummy test method.
"""
return "Hello I am " + self._name + "!"
このコードの問題はRadianteRPC
、Spyne によってオブジェクトとしてインスタンス化されたようには見えず、静的クラスとして使用されることです。
解決策 1: 現状では、Spyne はオブジェクトをインスタンス化しません。次に、何らかの状態を保存する必要がある場合は、クラス プロパティを介して行うことができます。
メソッドのパラメーターにアクセスできないためcls
、クラスをその名前で参照する必要があるため、次のようなことができます。
class RadianteRPC(ServiceBase):
_name = "Example"
@rpc(_returns=String)
def whoami(ctx): # ctx is the 'context' parameter used by Spyne
"""
Dummy test method.
"""
return "Hello I am " + RadianteRPC._name + "!"
解決策 2 (Spyne メーリング リストにあります):
多くの場合、クラス名を直接参照できない可能性があるため、別の方法があります。ctx パラメーターを介してクラスを見つけます。
class RadianteRPC(ServiceBase):
_name = "Example"
@rpc(_returns=String)
def whoami(ctx): # ctx is the 'context' parameter used by Spyne
"""
Dummy test method.
"""
return "Hello I am " + ctx.descriptor.service_class._name + "!"