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