python中的__new__方法

来源:互联网 发布:专业微信盗号软件 编辑:程序博客网 时间:2024/06/07 02:28

1. __new__概述

__new__方法只能用于从object继承的新式类。__new__方法负责创建实例对象,也可理解__new__方法为创建实例对象的一个工厂。

 一个实例对象的创建过程是:

1)    类对象调用__new__方法创建一个实例对象

2)    实例对象再调用__init__函数完成初始化

其中,__new__方法和__init__方法在创建对象的时候被自动调用。

那么__new__方法有什么意义呢?既然实例对象是由__new__方法创建的,如果我们重写__new__方法就可以控制实例对象的创建过程。__new__方法不是必须定义的,如果没有定义会默认调用object.__new__去创建一个对象,如果定义了就重写了__new__方法,可以自定义创建对象的行为。

 

 

class Car(object):     def __new__(cls, *args, **kwargs):        print("__new__方法被自动调用!")        return super().__new__(cls)     def __init__(self, name):        print("__init__方法被自动调用!")        self.color = "紫色"        self.name = name # 创建汽车car = Car("凯迪拉克")# 参数"凯迪拉克"先传递给__new__方法# __new__方法再将参数"凯迪拉克"传递给__init__方法
程序结果:

__new__方法被自动调用!

__init__方法被自动调用!

2. __new__案例

       通过__new__来控制实例对象创建个数.比如,在实际开发过程中,我们会碰到这样的场景,我们会限制某个实例对象创建的个数,比如国家主席,全国只有一个,那么国家主席这个实例对象只能被创建一个。

# 国家主席类class Chairman(object):     # 保存实例对象    __instance = None    # 控制__init__调用1次    __first_call = False     # 创建实例对象    def __new__(cls, *args, **kwargs):        if not cls.__instance:            # 创建实例对象            cls.__instance = super().__new__(cls)        # 返回实例对象        return cls.__instance     # 初始化实例对象    def __init__(self, name):        if Chairman.__first_call:            return        # 设置__init__函数被调用过        Chairman.__first_call = True        self.name = name     def speak(self):        print("%s开始给我们讲课..." % self.name)  chairman1 = Chairman("习大大")chairman2 = Chairman("奥巴马") # 国家主席讲话chairman1.speak()chairman2.speak() # 输出对象idprint(id(chairman1))print(id(chairman2))
程序结果:

习大大开始给我们讲课...

习大大开始给我们讲课...

40889256

40889256

原创粉丝点击