1.__new__方法的概念
语法

目的
Python 中存在于类中的构造方法__init__()负责将类实例化,而在__init__()执行之前,__new__()负责制造这样的一个实例对象,以便__init__()去让该实例对象更加的丰富。简单来说,__new__()是用来创建实例对象的方法,为对象分配内存空间
时机
在__init__()之前执行
返回值
返回当前类的实例对象
2.__new__方法实际应用
# 创建实例对象
class A(object):
def __new__(cls, *args, **kwargs):
print('这是一个__new__()方法')
return super().__new__(cls, *args, **kwargs) #super()调用父类的__new__
def __init__(self):
print("这是一个__init__()方法")
def hello(self):
print("hello")
a = A()
print(a)
输出:
这是一个__new__()方法
这是一个__init__()方法
<__main__.A object at 0x104b41010>单例模式(多次实例化只创建一个实例)
多次实例化创建多个对象:
class A():
def hello(self):
print('hello')
a1 = A()
print(a1)
a2 = A()
print(a2)
<__main__.A object at 0x100951010>
<__main__.A object at 0x100b50f50>
class A():
def hello(self):
print('hello')
a1 = A()
a1.age = 10
print(a1)
a2 = A()
print(a2.age)
Traceback (most recent call last):
File "/Users/luojie/PyCharmMiscProject/307.py", line 26, in <module>
print(a2.age)
^^^^^^
AttributeError: 'A' object has no attribute 'age'单例模式:
#单例模式:多次实例化,只创建一个对象
class A():
__instance = None #实例对象
def __new__(cls, *args, **kwargs):
if not cls.__instance:
obj = super().__new__(cls, *args, **kwargs)
cls.__instance = obj
return cls.__instance
def hello(self):
print('hello')
a1 = A()
a1.age = 18
print(a1)
a2 = A()
print(a2)
print(a2.age)
<__main__.A object at 0x104da30e0>
<__main__.A object at 0x104da30e0>
18