【python小白】 问关于__new__方法的作用的问题
问题描述
代码A:
# -*- coding:gb2312 -*-class Dog (object): def __init__(self):print('-----init方法-----') def __del__(self):print('-----del方法-----') def __str__(self):#print('-----str方法-----')return ('-----str方法-----') def __new__(cls):print('-----new方法-----')#return object.__new__(cls)xtq = Dog()
代码A运行结果:
代码B:
# -*- coding:gb2312 -*-class Dog (object): def __init__(self):print('-----init方法-----') def __del__(self):print('-----del方法-----') def __str__(self):#print('-----str方法-----')return ('-----str方法-----') def __new__(cls):print('-----new方法-----')object.__new__(cls)xtq = Dog()
代码B运行结果:
代码C:
# -*- coding:gb2312 -*-class Dog (object): def __init__(self):print('-----init方法-----') def __del__(self):print('-----del方法-----') def __str__(self):#print('-----str方法-----')return ('-----str方法-----') def __new__(cls):print('-----new方法-----')return object.__new__(cls)xtq = Dog()
代码C运行结果:
我的问题一:这三段代码A,B,C为什么输出的结果都不一样,原理在于哪里呢?特别是代码B和代码C,为什么代码C这一段,在B的基础上加上了return,结果就比B多了一个init方法。我的问题二:在给方法传参数的时候self和cls 这两个参数有啥区别?为什么__new__这个方法要的参数是cls而__init__方法要传入的参数是self?
问题解答
回答1:首先得先明白一件事情: self和cls的区别, cls是代表这个类, slef是用来代表这个类的实例, 如果这个搞清楚, 就成功了一点.
函数参数带有self的, 可以理解成这个函数, 是实例的方法, 是要和实例绑定的.
__new__方法, 是新式类用来创建实例使用的, 传入的cls就是用来给object.__new__创建实例使用的参数, 如果没有传入cls, object根本不知道创建什么样的实例.
结合上面, 现在再来说下三个输出不同的原因:
为什么只有--new, 因为每个类在实例化对象时, 都必须要调用这个__new__方法, 去创建实例, 所以它肯定会被调用, 但是因为该函数被你重写了, 所以它只是打印了--new方法, 并没有返回创建实例, 并且放回, 所以__del__也是不会发生
为什么只有--new和--del, 正如第1点说的那样, 但是这里确实__new___有创建新实例, 但是并没有返回, 因为只有返回了, 该对象才能进行下一步的__init__, 正因为这里只有创建, 没有返回, 所以结果这样
如果看懂前两点, 相信这个应该没啥问题, 因为创建了,并且返回了, 所以’__init__’也同样被执行了, 所有的东西都是像正常的行为那样发生
最后想说明: 为什么__del__会被执行, 理论上, 这个只有在实例被del析构时, 才会执行,这里并没有del xtq类似的代码, 为什么也会执行, 原因就是, 程序结束了, 要退出了, 在执行更底层的程序退出时, python自发做的内存回收, 所以一切尘归尘土归土, 创建的对象也被一一析构
相关文章:
1. PHP中的$this代表当前的类还是方法?2. javascript - vue2.0中使用vue2-dropzone的demo,vue2-dropzone的github网址是什么??百度不到。3. html5 - 目前 公司App 嵌入H5页面 做个 手机支付功能 没有做过 所以 请求各位有经验的 给个思路4. IOS app应用软件的id号怎么查询?比如百度贴吧的app-id=4779278135. html - 这种错位的时间轴怎么布局,然后用css实现?6. javascript - avalon.js ms-on 事件绑定无效 ?7. java - 如图代码,Collection 类中的iterator()是抽象方法,为什么可以调用?8. 鼠标过导航标签时,无效果,请问如何查找问题9. java - spring-data Jpa 不需要执行save 语句,Set字段就可以自动执行保存的方法?求解10. java - butterknife怎么绑定多个view