如何从Python XML-RPC服务器获取类变量值?
解决Python XML-RPC客户端无法访问服务器实例属性的问题
Python的SimpleXMLRPCServer注册类实例时,仅会暴露类中的可调用方法,而非直接暴露实例属性。当你在客户端尝试Device_1.Ip时,XML-RPC客户端会把Ip识别为一个未执行的方法对象,因此输出_Method实例,而非预期的属性值。
以下是两种可行的解决方案:
方案一:为属性添加Getter方法
在服务器端的类中,为每个需要访问的属性定义对应的获取方法:
修改后的类代码:
class PacificPowerActiveLoad(PacificPowerLowerLevel): """Main Class.""" def __init__(self, **kargs) -> None: """_summary.""" super(PacificPowerActiveLoad, self).__init__() # 修正原代码多余的逗号 # 直接用传入的参数初始化属性 self.Ip = kargs.get('Ip', "") self.Port = kargs.get('Port', "") self.Mode = "" # 0: CC, 1: CR, 2: CP, 3: CE self.Form = 'Single' # Single, Split, Three self.PhaseSelection = None self.Imax = "" self.CFSoll = "" # 添加属性获取方法 def get_Ip(self): return self.Ip def get_Port(self): return self.Port
客户端代码修改为:
import xmlrpc.client Device_1 = xmlrpc.client.ServerProxy("http://localhost:8000") print(Device_1.get_Ip()) print(Device_1.get_Port())
方案二:重写__getattr__统一处理属性访问
如果需要访问的属性较多,可以重写类的__getattr__方法,统一拦截属性访问请求并返回对应值:
修改后的类代码:
class PacificPowerActiveLoad(PacificPowerLowerLevel): """Main Class.""" def __init__(self, **kargs) -> None: """_summary.""" super(PacificPowerActiveLoad, self).__init__() self.Ip = kargs.get('Ip', "") self.Port = kargs.get('Port', "") self.Mode = "" # 0: CC, 1: CR, 2: CP, 3: CE self.Form = 'Single' # Single, Split, Three self.PhaseSelection = None self.Imax = "" self.CFSoll = "" def __getattr__(self, name): # 检查属性是否存在于实例中 if hasattr(self, name): # 返回一个无参函数,供XML-RPC调用时返回属性值 return lambda: getattr(self, name) # 不存在的属性抛出异常 raise AttributeError(f"'PacificPowerActiveLoad' object has no attribute '{name}'")
客户端代码调用时需为属性名添加括号(因为XML-RPC需要执行方法):
import xmlrpc.client Device_1 = xmlrpc.client.ServerProxy("http://localhost:8000") print(Device_1.Ip()) print(Device_1.Port())
内容的提问来源于stack exchange,提问作者Yijian
相关产品推荐
相关产品推荐

