You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 19:10:29