V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
UN2758
V2EX  ›  Python

Python 类相关问题

  •  
  •   UN2758 · 2020-08-30 14:31:14 +08:00 · 2184 次点击
    这是一个创建于 1341 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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




    xiaolinjia
        9
    xiaolinjia  
       2020-08-30 16:38:59 +08:00
    不如说是哪个库,我去看看。
    zachlhb
        10
    zachlhb  
       2020-08-30 16:40:35 +08:00 via Android
    monkey patch ?
    laike9m
        11
    laike9m  
       2020-08-30 16:57:06 +08:00 via Android
    看起来代码也是在本地,直接打个断点跟一下不就知道了
    UN2758
        12
    UN2758  
    OP
       2020-08-30 17:07:43 +08:00
    @xiaolinjia #9 rqsdk
    @zachlhb #10 啥?
    @laike9m #11 这个是把参数传给服务器的...
    xiaolinjia
        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)
    imn1
        14
    imn1  
       2020-08-30 18:31:14 +08:00
    @xiaolinjia #13
    我就猜到是动态继承或者动态调用
    这种写法很多就建一个虚构的类,这个类不一定实例化
    或者绝大多数在实际场景转到其他实例,这个类只是“以防万一”才用到
    zachlhb
        15
    zachlhb  
       2020-08-30 20:10:51 +08:00 via Android
    @UN2758 #12 猴子补丁啊,可以在程序运行过程中动态更改类方法的,建议百度了解下
    PTLin
        16
    PTLin  
       2020-08-30 21:40:56 +08:00
    找找有没有代码改了__class__这个属性
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2293 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:41 · PVG 16:41 · LAX 01:41 · JFK 04:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.