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