加入收藏 | 设为首页 | 会员中心 | 我要投稿 3v站长网 (https://www.3vvv.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Python 中类的构造办法 __New__ 的妙用

发布时间:2021-10-20 13:27:14 所属栏目:语言 来源:互联网
导读:Python 的类中,所有以双下划线__包起来的方法,叫魔术方法,魔术方法在类或对象的某些事件发出后可以自动执行,让类具有神奇的魔力,比如常见的构造方法__new__、初始化方法__init__、析构方法__del__,今天来聊一聊__new__的妙用,主要分享以下几点: __ne
Python 的类中,所有以双下划线__包起来的方法,叫魔术方法,魔术方法在类或对象的某些事件发出后可以自动执行,让类具有神奇的魔力,比如常见的构造方法__new__、初始化方法__init__、析构方法__del__,今天来聊一聊__new__的妙用,主要分享以下几点:
 
__new__ 和 __init__ 的区别
应用1:改变内置的不可变类型
应用2:实现一个单例
应用3:客户端缓存
应用4:不同文件不同的解密方法
应用5:Metaclasses
__new__ 和 __init__ 的区别
1、调用时机不同:new 是真正创建实例的方法,init 用于实例的初始化,new 先于 init 运行。
 
2、返回值不同,new 返回一个类的实例,而 init 不返回任何信息。
 
3、new 是 class 的方法,而 init 是对象的方法。
 
示例代码:
 
class A: 
    def __new__(cls, *args, **kwargs): 
        print("new", cls, args, kwargs) 
        return super().__new__(cls) 
 
    def __init__(self, *args, **kwargs): 
        print("init", self, args, kwargs) 
 
 
def how_object_construction_works(): 
    x = A(1, 2, 3, x=4) 
    print(x)     
    print("===================") 
    x = A.__new__(A, 1, 2, 3, x=4) 
    if isinstance(x, A): 
        type(x).__init__(x, 1, 2, 3, x=4) 
    print(x) 
 
if __name__ == "__main__": 
    how_object_construction_works() 
上述代码定义了一个类 A,在调用 A(1, 2, 3, x=4) 时先执行 new,再执行 init,等价于:
 
x = A.__new__(A, 1, 2, 3, x=4) 
if isinstance(x, A): 
    type(x).__init__(x, 1, 2, 3, x=4) 
代码的运行结果如下:
 
new <class '__main__.A'> (1, 2, 3) {'x': 4} 
init <__main__.A object at 0x7fccaec97610> (1, 2, 3) {'x': 4} 
<__main__.A object at 0x7fccaec97610> 
=================== 
new <class '__main__.A'> (1, 2, 3) {'x': 4} 
init <__main__.A object at 0x7fccaec97310> (1, 2, 3) {'x': 4} 
<__main__.A object at 0x7fccaec97310> 
new 的主要作用就是让程序员可以自定义类的创建行为

(编辑:3v站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读