【发布时间】:2014-08-14 10:42:54
【问题描述】:
我在许多 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 + "!"
【问题讨论】:
-
您能举个例子吗?方法是用
@staticmethod还是@classmethod装饰的? -
不,这些方法没有用 staticmethod 或 classmethod 修饰。该问题与 Spyne 架构有关,不是“Python”问题。
-
@jonrsharpe 我添加了对我的问题的更好解释。我需要重新打开问题以添加解决方案作为答案。
-
就目前而言,这仍然不是一个好问题 - 例如,您之前的尝试究竟发生了什么?错误(提供完整的追溯)?考虑阅读this checklist。
-
提供回溯是没有意义的(回溯没有提供任何解决方案的线索)。是的,我进行了研究,深入研究了 Spyne 源代码,并且阅读了文档。