简谈Python中的__new__和__init__

今天想跟大家谈谈有关Python中的__new__和__init__的问题,其实这个问题对于我来说还是比较难的,想要彻底弄明白这两个的区别的确不是一件容易的事情。下面就是我自己的一些简单的看法。

首先我们要明白一点的是,只有继承于object的类,或者更准确的说,祖先类是object类才有__new__方法,其他的类没有这个方法。还有一点需要注意是__new__先于__init__被调用,而__new__必须要有返回值,返回的就是__init__的第一个参数self。

好了,下面我们来看看__new__和__init__到底是个什么东西。

我们还是通过一个例子来看看吧。

class Person(object):
    """Wilson Person"""
 
    def __new__(cls, name, age):
        print ('__new__ is called.')
        return super(Person, cls).__new__(cls, name, age)
 
    def __init__(self, name, age):
        print ('__init__ is called.')
        self.name = name
        self.age = age
 
    def __str__(self):
        return '<Person: %s(%s)>' % (self.name, self.age)
 
if __name__ == '__main__':   
    Wilson = Person('Wilson', 24)
print(Wilson)


执行结果如下:

__new__ is called.
__init__ is called.
<Person: Wilson(24)>
从上面的例子我们可以看到,__new__方法先于__init__方法被调用,我们下面来看看当实例化一个对象的时候,具体的逻辑顺序是怎么样的。

Wilson = Person('Wilson', 24)
当我们实例化一个对象的时候,它的逻辑顺序是这样的:

  1. 首先程序会把name和age这两个参数传递给__new__方法,这个方法会返回一个Person类的实例。上面代码重写了__new__方法,这也是该方式通常运行的方式
  2. 然后这个实例会通过__init__的第一个参数self传入__init__的方法中,然后把参数真正的初始化
所以我们简单的总结一下,
  • __init__方法主要是用来初始化一些实例的参数,比如添加一些属性,或者做一些其他的事情,这个初始化过程发生在实例被创建以后。
  • __new__方法通常用来控制的实例产生的过程,它可以对这个类做一些配置或者处理。
__init__方法大家应该都比较熟悉了,下面通过一个经典的例子来看看__new__的作用,它就是利用__new__如何实现单例模式
我们还是先看代码
# -*- coding: utf-8 -*-


class Singleton(object):
	"""docstring for Singleton"""
	# 利用__new__来实现单例模式
	def __new__(cls):
		if not hasattr(cls, 'instance'):
			cls.instance = super(Singleton, cls).__new__(cls)
		return cls.instance

# 进行测试,是否实现单例模式
Singleon1 = Singleton()
Singleon2 = Singleton()
Singleon1.value1 = "Wilson"

print(Singleon1 is Singleon2)
print(Singleon2.value1)
通过上面的例子,大家可以看到用__new__实现单例模式的方法,Singleon1和Singleton2都拥有value1属性,他们俩个是同一个实例。
以上就是今天的全部内容
与您共勉












  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值