各种源+super()

nodejs 源

npm --registry=http://registry.npm.taobao.orginstall -d)

pip源

网上有很多可用的源,例如豆瓣:http://pypi.douban.com/simple/

清华:https://pypi.tuna.tsinghua.edu.cn/simple

最近使用得比较多并且比较顺手的是清华大学的pip源,它是官网pypi的镜像,每隔5分钟同步一次,地址为https://pypi.tuna.tsinghua.edu.cn/simple

临时使用:

可以在使用pip的时候加参数-ihttps://pypi.tuna.tsinghua.edu.cn/simple

例如:pip install -ihttps://pypi.tuna.tsinghua.edu.cn/simplegevent,这样就会从清华这边的镜像去安装gevent库。

永久修改,一劳永逸:

linux下,修改 ~/.pip/pip.conf (没有就创建一个), 修改 index-url至tuna,内容如下:

[global]index-url = https://pypi.tuna.tsinghua.edu.cn/simple

windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini,内容如下

[global]index-url = https://pypi.tuna.tsinghua.edu.cn/simple

super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。总之前人留下的经验就是:保持一致性。要不全部用类名调用父类,要不就全部用 super,不要一半一半。

注意:super继承只能用于新式类,用于经典类时就会报错。

新式类:必须有继承的类,如果没什么想继承的,那就继承object

经典类:没有父类,如果此时调用super就会出现错误:『super() argument 1 must be type, not classobj』

super对象在搜索命名空间时,其实是基于类实例的mro进行。那么什么是mro呢?查找官方文档,有:

PyObject* tp_mro

Tuple containing the expanded set of base types, starting with the type itself and

ending with object, in Method Resolution Order.

This field is not inherited; it is calculated fresh by PyType_Ready().

super并非是一个函数,而是一个类(PySuper_Type)

Python 会计算出一个方法解析顺序(Method Resolution Order, MRO)列表它代表了类继承的顺序,我们可以使用下面的方式获得某个类的 MRO 列表:

super 原理

super的工作原理如下:

def  super(cls,inst):

      mro=inst.__class__.mro()

       returnmro[mro.index(cls)+1]

其中,cls 代表类,inst 代表实例,上面的代码做了两件事:

获取 inst 的 MRO 列表

查找 cls 在当前 MRO 列表中的 index, 并返回它的下一个类,即 mro[index + 1]

当你使用super(cls, inst)时,Python 会在 inst 的 MRO 列表上搜索 cls 的下一个类。


小结

事实上,super和父类没有实质性的关联。

super(cls, inst)获得的是 cls 在 inst 的 MRO 列表中的下一个类。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容