\__new__()方法

在Python中,我们目前已经学了3个魔术方法了,分别是__init__()、__str__()、__del__(),接下来介绍一下__new__()方法。

使用类名()创建对象时,Python的解释器首先会调用__new__方法为对象分配空间。

new是一个由object积累提供的内置的静态方法,主要作用有两个:

○ 在内存中为对象分配空间

○ 返回对象的引用

Python解析器获得对象的引用后,将引用作为第一个参数,传递给__init__方法重写__new__方法的代码非常固定,一定要使用return super(). __new__(cls),否则Python解释器得不到分配了空间的对象引用,就不会调用对象的初始化方法。

__new__方法是一个静态方法,在调用时,要求将自身类信息cls作为参数传递到这个方法中,这个方法属于object类中的一个静态方法。

案例:


定义一个播放器类

class MusicPlayer(object):

重写__new__()魔术方法

def new(cls, *args, **kwargs):

print('1、开辟内存空间')

print('2、返回实例化对象引用地址')

return super().new(cls)

def init(self, name):

self.name = name

1、实例mp1对象

mp1 = MusicPlayer('红色的高跟鞋')

print(mp1)

2、实例化mp2对象

mp2 = MusicPlayer('春夏秋冬')

print(mp2)


4、单例模式的代码实现


定义一个播放器类

class MusicPlayer(object):

定义一个类属性,如instance,用于记录之前实例化对象返回的内存引用

instance = None

重写__new__()魔术方法

def new(cls, *args, **kwargs):

判断实例化时有没有分配过内存空间

if cls.instance is None:

cls.instance = super().new(cls)

return cls.instance

def init(self, name):

self.name = name

1、实例mp1对象

mp1 = MusicPlayer('红色的高跟鞋')

print(mp1)

2、实例化mp2对象

mp2 = MusicPlayer('春夏秋冬')

print(mp2)


注:类属性在内存中是一个特殊的存在,其不用于以前讲过的局部变量(局部变量当函数执行完毕后,其会被内存所销毁)。但是类属性一旦定义,除非对象以及这个类在内存中被销毁了,否则其不会自动销毁。

相关推荐
Irene19911 天前
Flink 学习日志 01:前端转大数据的实战避坑指南
java·jvm·flink
小天源1 天前
从 Nginx 日志到访问分析:轻量化网站监测服务的架构实践
jvm·nginx·网络安全·架构·网络监控
十年Java程序媛2 天前
JVM 内存区域与对象内存布局|new 对象底层流程,对象头 MarkWord 详解
java·jvm·spring boot
用户094248568032 天前
第2章:Windows、WSL2 与 Docker 环境搭建Redis
java·jvm
梅梅绵绵冰2 天前
JVM虚拟机
java·开发语言·jvm
十年Java程序媛2 天前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
Lhappy嘻嘻3 天前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm
CS创新实验室3 天前
Python 对象“死“了之后去了哪?——引用计数与分代垃圾回收
开发语言·jvm·python
wuminyu3 天前
JMM学习总结:深入理解happens-before关系
java·linux·c语言·jvm·c++
DongQiShanRen4 天前
六根硬件映射(下):物理闭环五步法,抽一条已实装的看
大数据·jvm·人工智能·算法·rust·哈希算法·集成学习