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
阅读全文
0 0
- python中的__new__()方法
- python中的__new__方法
- 关于python中的__new__方法
- 详解python中的__new__方法
- Python中的__new__()方法的使用实例
- Python的__new__方法
- python __new__方法
- Python中的__init__方法与__new__方法的区别
- Python中的__new__、__init__、__call__三个特殊方法
- 详解Python中的__new__、__init__、__call__三个特殊方法
- python 中的 __new__ 和 __init__
- python中的__new__概念(工厂
- Python中的__init__和__new__
- python metaclass 和 __new__方法
- Python __new__() 方法与__init__()方法
- 浅谈 Python 中的 __init__ 和 __new__
- 详解Python中的__init__和__new__
- 详解Python中的__init__和__new__
- hdu2181哈密顿绕行世界问题
- SQL——存储过程、触发器
- 从零学习BlackHatPython之——VMware Workstation安装Kali Linux并进行配置
- Linux操作系统的安装
- Java内存模型--By William
- python中的__new__方法
- linux各目录的作用
- 抽象类,接口,多肽和内部类以及内存管理
- Java的反射机制
- Mybatis学习笔记-初识
- c语言之循环赛算法
- 上下文切换
- phpstorm点滴
- SpringBoot学习之入门篇