__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
,说明对一个实例的属性进行修改会影响到其他所有实例。