首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RPyC -从公开类继承

RPyC -从公开类继承
EN

Stack Overflow用户
提问于 2020-11-09 16:03:12
回答 1查看 395关注 0票数 0

我有一个导入特定模块的RpyC服务器,应该公开这个模块中的一个类,这样就可以从客户端继承这个类。

出于测试目的,我删除了导入/公开模块,并在我的RPyC服务中创建了一个名为exposed_TestClass的简单类。

服务器端: rpyc_server.py

代码语言:javascript
复制
import rpyc
from rpyc.utils.server import ThreadedServer

class MyService(rpyc.Service):
    class exposed_TestClass:
        def exposed_Exec(self):
            print("original print of class")

t = ThreadedServer(MyService, port=12345)
t.start()

客户端: python3外壳

代码语言:javascript
复制
>>> import rpyc
>>> conn = rpyc.connect("localhost", 12345)
>>> conn.root.TestClass
<class 'exposed_TestClass'>
>>> conn.root.TestClass()
<exposed_TestClass object at 0x7f2dda642588>
>>> #calling the Exec function also works, prints at server side
>>> conn.root.TestClass().Exec()
>>>
>>>
>>> # test inheriting class
>>> class MyClass(conn.root.TestClass):
...     def NewMethod(self):
...         print("printing from new method")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3/dist-packages/rpyc/core/netref.py", line 220, in method
    return syncreq(_self, consts.HANDLE_CALLATTR, name, args, kwargs)
  File "/usr/lib/python3/dist-packages/rpyc/core/netref.py", line 74, in syncreq
    conn = object.__getattribute__(proxy, "____conn__")
AttributeError: 'str' object has no attribute '____conn__'
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-20 04:54:42

根据关于:https://rpyc.readthedocs.io/en/latest/tutorial/tut2.html的文档

netrefs (网络引用,也称为透明对象代理)是一些特殊的对象,它们将在本地完成的所有操作委托给相应的远程对象。Netrefs可能不是真正的函数或模块列表,但它们“尽了最大努力”来查看和感觉它们指向…的对象。事实上,他们甚至愚弄了python的内省机制!

在客户端,如果您这样做了:

代码语言:javascript
复制
import rpyc
conn = rpyc.connect("localhost", 12345)

o=conn.root.TestClass()
type_o = type(o)
print(type_o)

它将打印出来:

代码语言:javascript
复制
<netref class 'rpyc.core.netref.__main__.exposed_TestClass'>

因此,当试图做:

代码语言:javascript
复制
class MyClass(type_o):
    def NewMethod(self):
        print("printing from new method")

您继承的是代理类定义,而不是远程类定义。所以当文档声明

他们“尽力而为”

,我认为它排除了从远程类进行继承的可能性。如果有人能找到满足你要求的方法,我会非常高兴的。

请注意,我通过使用以下行设置服务器进行了测试:

代码语言:javascript
复制
t = ThreadedServer(MyService, port=12345, protocol_config={ 'allow_all_attrs': True })
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64755053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档