Python中的 __new__方法

 

__new__是Python面向对象语言中一个很少用的函数,更多使用的是init这个函数。

根据官方文档:

  • __init__是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值。

  • __new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例,是个静态方法。

也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。

class Book(object):
    def __new__(cls, title):
        print '__new__'
        return super(Book, cls).__new__(cls)

    def __init__(self, title):
        print '__init__'
        super(Book, self).__init__(self)
        self.title = title

b = Book('The Django Book')
print(b.title)
  •  

上面执行的结果:

__new__
__init__
The Django Book

 

用__new__来实现单例

事实上,当我们理解了__new__方法后,我们还可以利用它来做一些其他有趣的事情,比如实现 设计模式中的 单例模式(singleton) 。
因为类每一次实例化后产生的过程都是通过__new__来控制的,所以通过重载__new__方法,我们 可以很简单的实现单例模式。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

class Singleton(object):

    def __new__(cls):

        # 关键在于这,每一次实例化的时候,我们都只会返回这同一个instance对象

        if not hasattr(cls, 'instance'):

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

        return cls.instance

 

obj1 = Singleton()

obj2 = Singleton()

 

obj1.attr1 = 'value1'

print obj1.attr1, obj2.attr1

print obj1 is obj2

输出结果:

 

1

2

value1 value1

True

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值