如何通过Python的__new__方法实现单例模式?
- 内容介绍
- 文章标签
- 相关推荐
本文共计651个文字,预计阅读时间需要3分钟。
介绍 init 方法init 方法通常用于在初始化一个类实例时调用,但它并非实例化一个类的第一步调用。当使用 Student(id, name) 这样的表达式实例化一个类时,首先被调用的是 init 方法。
介绍
init 方法通常用在初始化一个类实例时候,但其实它不是实例化一个类的时候第一个被调用 的方法。当使用 Student(id, name) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 new 方法。
new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。
new为对象分配空间,是内置的静态方法,new在内存中为对象分配了空间也返回了对象的引用,init获得了这个引用才初始化这个实例。
示例
一个非常简单的单例
class A: instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance
因为new方法是一个静态方法(也就是在定义的时候就没有cls参数),所以在这里要传入一个cls参数,而且这里的new你改造过了,所以要返回爸爸的new方法。
本文共计651个文字,预计阅读时间需要3分钟。
介绍 init 方法init 方法通常用于在初始化一个类实例时调用,但它并非实例化一个类的第一步调用。当使用 Student(id, name) 这样的表达式实例化一个类时,首先被调用的是 init 方法。
介绍
init 方法通常用在初始化一个类实例时候,但其实它不是实例化一个类的时候第一个被调用 的方法。当使用 Student(id, name) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 new 方法。
new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。
new为对象分配空间,是内置的静态方法,new在内存中为对象分配了空间也返回了对象的引用,init获得了这个引用才初始化这个实例。
示例
一个非常简单的单例
class A: instance = None def __new__(cls, *args, **kwargs): if cls.instance is None: cls.instance = super().__new__(cls) return cls.instance
因为new方法是一个静态方法(也就是在定义的时候就没有cls参数),所以在这里要传入一个cls参数,而且这里的new你改造过了,所以要返回爸爸的new方法。

