python3对象初始化_python3面向对象(4)之__new__方法和__init__方法

1.简单来说__new__方法和__init__方法都是类中的内置方法;这两个方法再实例化对象的时候会被自动调用;

2.__new__方法的调用在 __init__方法之前;

3.__new__方法中有个参数:cls   ;  __init__方法中有个参数是self

4.__new__方法的作用是:(1)为实例化对象分配一个空间(2)返回这个对象的引用

5.__init__方法的作用是对这个实例化对象再次加工;self指的就是这个实例化对象

看代码:

class MusicPlayer(object): #创建一个音乐播放器

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

print("创建对象,分配空间") # 1. 创建对象时,new方法会被自动调

instance = super().__new__(cls) # 2. 为对象分配空间

return instance # 3. 返回对象的引用,必须的有这个返回,不然self找不到对象

def __init__(self,name): #初始化方法;对这个实例化对象再次加工

self.name = name

print("播放器初始化")

# 创建播放器对象

player = MusicPlayer("小米")

print(player)

做个不是很恰当的比喻(暂时想到的这个);类就好比一张大楼的图纸;我们要按着这个图纸去建大楼;而__new__方法就好比建造这个大楼的地址,你是要在北京盖楼还是上海盖楼,必须有个明确的地址,而__init__方法就好比;有了图纸和地方就开始建楼吧。

二通过__new__方法实现单例模式

首先要明白什么是单例模式:简单理解就是一个类只能创建一个实例对象(还用上面这个比喻,就是说我们这个开发商比较小,只能拿到一块地皮;当我们第一次用这块地盖了楼,又想盖第二栋没有地皮怎么办啊,简单把把上次盖好的拆掉就又有地方了啊)

看代码:

class MusicPlayer(object):

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

# 1. 创建对象时,new方法会被自动调用

print("创建对象,分配空间")

# 2. 为对象分配空间

instance = super().__new__(cls)

# 3. 返回对象的引用

return instance

def __init__(self):

print("播放器初始化")

# 创建播放器对象

player1 = MusicPlayer()

player2 = MusicPlayer()

print(id(player1))

print(id(player2))

打印结果:这是一个正常的实例化对象;创建了两个对象;这两个对象的ID是不一样的

创建对象,分配空间

播放器初始化

创建对象,分配空间

播放器初始化

2525789450312

2525789421464

单例模式:

class MusicPlayer(object):

instance = None #定义一个类属性为None

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

# 1. 创建对象时,new方法会被自动调用

print("创建对象,分配空间")

if cls.instance is None: #如果这个类属性为None就为这个对象分配一个空间

# 2. 为对象分配空间

cls.instance = super().__new__(cls)

# 3. 返回对象的引用

return cls.instance #否则返回上一个对象空间

def __init__(self):

print("播放器初始化")

# 创建播放器对象

player1 = MusicPlayer()

player2 = MusicPlayer()

print(id(player1))

print(id(player2))

结果:

创建对象,分配空间

播放器初始化

创建对象,分配空间

播放器初始化

2300636655688

2300636655688

那么创建的两个实例化对象的id就一样了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值