Python 类相关问题

2020-08-30 14:31:14 +08:00
 UN2758

看代码的时候发现有个 Client 类没有方法的具体实现,但是方法却能执行对应的功能 Python3:

class Client():
	def execute(*args,**kargs):
    	pass
        

看着不像工厂模式啊,也没有继承某个类或者加了装饰器,之前也见过类似的代码,但是不知道这种写法叫什么

2267 次点击
所在节点    Python
16 条回复
imn1
2020-08-30 14:37:00 +08:00
那类里面有没有其他魔术方法?如__call__
ysc3839
2020-08-30 14:50:26 +08:00
你看的可能是 .pyi 文件,这是给 IDE 看的声明文件,具体的实现在外部模块里。
UN2758
2020-08-30 15:13:07 +08:00
@imn1 #1 没有看到魔术方法....
xiaolinjia
2020-08-30 15:26:23 +08:00
可能这个类是 C 写的
imn1
2020-08-30 15:26:41 +08:00
现在主要是看不到具体代码,是否这个类直接实例化也不知道
这个类估计要继承或被继承的,不然没必要上括号,或者是个 metaclass

如果是抽象类,直接写 pass 很正常
如果是动态继承,魔术方法写在另一个类里面,这个类里面只是“占位式”地写个 pass,也是正常
wuwukai007
2020-08-30 15:28:16 +08:00
c 写的拓展,看不到源码的。
UN2758
2020-08-30 15:57:33 +08:00
@ysc3839 #2 是 py 文件
UN2758
2020-08-30 16:01:17 +08:00
@xiaolinjia #4
@imn1 #5
@wuwukai007 #6
@imn1 #1
@ysc3839 #2




xiaolinjia
2020-08-30 16:38:59 +08:00
不如说是哪个库,我去看看。
zachlhb
2020-08-30 16:40:35 +08:00
monkey patch ?
laike9m
2020-08-30 16:57:06 +08:00
看起来代码也是在本地,直接打个断点跟一下不就知道了
UN2758
2020-08-30 17:07:43 +08:00
@xiaolinjia #9 rqsdk
@zachlhb #10 啥?
@laike9m #11 这个是把参数传给服务器的...
xiaolinjia
2020-08-30 18:00:02 +08:00
我大概看了下,说实话,这 global 用的我快吐了。
首先看 DummyClient.execute,里面直接抛异常,说没初始化。
然后我就看了 rqdatac.client.init 函数,这是初始化客户端的函数,然后里面用 global _CLIENT,然后把这个变量重新绑定了另外两个实例。所以,你上面的 get_client()返回的_CLIENT,已经不是 DummyClient 的实例了,而是下面两个 ConnectionPool 、ThreadLocalConnection 类的实例。然后调用的其实是他们两个类之一的 execute 方法。
if kwargs.pop("use_pool", False):
from .connection_pool import ConnectionPool
max_pool_size = kwargs.pop("max_pool_size", 8)
_CLIENT = ConnectionPool(addr, auth=auth_info, max_pool_size=max_pool_size, **extra_args)
else:
from .thread_local import ThreadLocalConnection
_CLIENT = ThreadLocalConnection(addr, auth=auth_info, **extra_args)
imn1
2020-08-30 18:31:14 +08:00
@xiaolinjia #13
我就猜到是动态继承或者动态调用
这种写法很多就建一个虚构的类,这个类不一定实例化
或者绝大多数在实际场景转到其他实例,这个类只是“以防万一”才用到
zachlhb
2020-08-30 20:10:51 +08:00
@UN2758 #12 猴子补丁啊,可以在程序运行过程中动态更改类方法的,建议百度了解下
PTLin
2020-08-30 21:40:56 +08:00
找找有没有代码改了__class__这个属性

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/702580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX