__new__和__init__方法
代码语言:javascript复制class A(object):
def __init__(self):
print("这是 init 方法")
def __new__(cls):
print("这是 new 方法")
return object.__new__(cls)
A()总结
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。__new__必须要有返回值,返回实例化出来的实例。可以通过返回父类的__new__出来的实例,或者直接使用object的__new__。__init__有一个参数self,就是__new__返回的实例。__init__在__new__的基础上可以完成一些其他初始化的动作。__init__不需要返回值。
单例设计模式
举个常见的单例模式例子,我们日常使用的电脑上都有一个回收站,在整个操作系统中,回收站只能有一个实例,整个系统都使用这个唯一的实例,而且回收站自行提供自己的实例。因此回收站是单例模式的应用。
单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。单例类是一种对象创建型模式。
代码语言:javascript复制# 实例化一个单例
class Singleton(object):
__instance = None
__is_first = True
def __new__(cls, age, name):
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
def __init__(self, age, name):
if self.__is_first: # 不会再创建第二个对象
self.age = age
self.name = name
Singleton.__is_first = False
a = Singleton(18, "张三")
b = Singleton(28, "张三")
print(id(a))
print(id(b))
print(a.age) # 18
print(b.age) # 18
a.age = 19
print(b.age)__instance是一个类变量,用于存储单例实例。__is_first是一个类变量,表示是否是第一次创建实例。__new__方法在创建实例时被调用。如果__instance为None,说明还没有创建实例,此时通过object的__new__方法创建一个新实例,并将其赋值给__instance。如果__instance不为None,说明已经创建过实例,直接返回当前的__instance实例。__init__方法在实例化后调用。如果是第一次创建实例,则进行初始化操作。由于第一次创建实例后__is_first被设置为False,因此后续创建的实例不会执行初始化操作。- 最后打印出实例
a和b的内存地址,发现它们是同一个实例。 - 打印出
a.age和b.age,发现它们的值都是18,说明它们共享相同的属性。 - 修改
a.age为19,再次打印b.age,发现其值也是19,说明对一个实例的属性进行修改会影响到其他所有实例。


