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

猜你喜欢

转载自blog.csdn.net/Panda996/article/details/82495595