看代码的时候发现有个 Client 类没有方法的具体实现,但是方法却能执行对应的功能 Python3:
class Client():
def execute(*args,**kargs):
pass
看着不像工厂模式啊,也没有继承某个类或者加了装饰器,之前也见过类似的代码,但是不知道这种写法叫什么
1
imn1 2020-08-30 14:37:00 +08:00
那类里面有没有其他魔术方法?如__call__
|
2
ysc3839 2020-08-30 14:50:26 +08:00 via Android
你看的可能是 .pyi 文件,这是给 IDE 看的声明文件,具体的实现在外部模块里。
|
4
xiaolinjia 2020-08-30 15:26:23 +08:00
可能这个类是 C 写的
|
5
imn1 2020-08-30 15:26:41 +08:00
现在主要是看不到具体代码,是否这个类直接实例化也不知道
这个类估计要继承或被继承的,不然没必要上括号,或者是个 metaclass 如果是抽象类,直接写 pass 很正常 如果是动态继承,魔术方法写在另一个类里面,这个类里面只是“占位式”地写个 pass,也是正常 |
6
wuwukai007 2020-08-30 15:28:16 +08:00
c 写的拓展,看不到源码的。
|
8
UN2758 OP |
9
xiaolinjia 2020-08-30 16:38:59 +08:00
不如说是哪个库,我去看看。
|
10
zachlhb 2020-08-30 16:40:35 +08:00 via Android
monkey patch ?
|
11
laike9m 2020-08-30 16:57:06 +08:00 via Android
看起来代码也是在本地,直接打个断点跟一下不就知道了
|
12
UN2758 OP |
13
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) |
14
imn1 2020-08-30 18:31:14 +08:00
|
16
PTLin 2020-08-30 21:40:56 +08:00
找找有没有代码改了__class__这个属性
|