python中的__new__方法与__init__方法区别与调用;通过使用__new__实现单例模式
2018-03-11 10:48
951 查看
本文只讨论python2环境下的一些必知相关话题,秉承极简阐述
许多pythoner在编程的过程中可能使用过_new_与_init_方法,但是却没有去理解过它们,今天以前我也一样,但是今天以后我可以说我理解了!
本文所有与类有关的话题中,类都指的是新类
注意:
看下图,我们可以知道一般情况:
看下图我们得到另一种情况:
运行结果如下:
那么非单例模式会返回什么呢,我们修改MyClass的继承类如下
运行结果如下:
许多pythoner在编程的过程中可能使用过_new_与_init_方法,但是却没有去理解过它们,今天以前我也一样,但是今天以后我可以说我理解了!
本文所有与类有关的话题中,类都指的是新类
分别有什么功能
__new__是用来创造一个类的实例(constructor),调用时所接收的第一个参数是cls 而__init__是用来初始化一个实例(initializer),调用时所接收的第一个参数是self
调用顺序
先调用new方法然后再调用init方法 原因:既然init是用来初始化一个实例的,那么实例哪里来的呢,当然要先调用new来创建然后才能对这个实例进行初始化。
调用时传参的区别
其实能理解调用顺序的话对于传递的参数就很好理解了: __new__所接收的第一个参数是cls,因为要创建实例,那么实例是根据什么来创建呢?当然是类了,所以传递cls; __init__所接收的第一个参数是self,self指的是要初始化的对象,也就是new出来的对象
两者在调用时候的联系
下文将通过重载_new_和_init_来讲解两者在调用时的不同注意:
__init__中不能有返回值
看下图,我们可以知道一般情况:
在__new__返回一个新创建并且属于该类的实例时当前类的__init__会被调用
看下图我们得到另一种情况:
如果__new__返回的实例不属于当前类,那么当前类的__init__不会被调用;另外,如果__new__不返回任何对象的话也会出现这种情况
一个小练习
通过使用__new__实现单例模式 单例模式是确保一个类只有一个实例,并且这个实例是自己创造的,在系统中用到的都是这个实例
class SingleTon(object): def __new__(cls, *args, **kwargs): #每一次实例化的时候,我们都只会返回这同一个instance if not hasattr(cls, 'instance'): cls.instance = super(SingleTon, cls).__new__(cls) return cls.instance class MyClass(SingleTon): def __init__(self, val): self.val = val def obj_fun(self): print self.val, 'obj_fun' if __name__=="__main__": a = MyClass(1) b = MyClass(2) print a is b print id(a), id(b) # 类型验证 print type(a) # <class '__main__.MyClass'> print type(b) # <class '__main__.MyClass'>
运行结果如下:
由以上运行结果中两个实例的id一致可验证实现了单例模式
那么非单例模式会返回什么呢,我们修改MyClass的继承类如下
class MyClass(object):
运行结果如下:
一目了然,我们创建了两个不同的实例,非单例模式
相关文章推荐
- Python 中__init__.py的使用(通过包调用方法)
- python实现单例模式__init__ __new__区别
- Python 中__init__.py的使用(通过包调用方法)
- main函数中通过使用Person类和AddressBook类,创建对象、调用方法,实现以下8个功能
- initialize和init以及load方法的区别与使用以及什么时候调用
- python使用smtplib模块通过gmail实现邮件发送的方法
- 微信的API都是通过https调用实现的,分为post方法调用和get方法调用。不需要上传数据的采用get方法(使用IntraWeb开发)
- python使用smtplib模块通过gmail实现邮件发送的方法
- python使用multiprocessing模块实现带回调函数的异步调用方法
- Python使用logging结合decorator模式实现优化日志输出的方法
- 使用Python通过win32 COM实现Word文档的写入与保存方法
- python中7种实现单例模式的方法:staticmethod、classmethod、类属性方法、__new__、装饰器、元类、名字覆盖
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- python中__init__()方法和__new__()方法的区别
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法实现边缘检测代码(2)
- Python中的__init__方法与__new__方法的区别
- python中getattr函数使用方法 getattr实现工厂模式
- Python中__new__与__init__方法的区别详解
- 为什么不使用工厂模式,以new Class的方式实例化对象并调用方法不利于项目升级的维护
- python中getattr函数使用方法 getattr实现工厂模式