博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 特殊方法__new__()
阅读量:4189 次
发布时间:2019-05-26

本文共 1233 字,大约阅读时间需要 4 分钟。

目录


 

描述

特殊方法 __new__()用来创建一个实例,它至少有一个参数cls,代表当前类。默认情况下__new__()会创建当前类的实例,该方法也可以被重载,重载后也可以创建其他类的实例。

 

语法和参数

cls.__new__(cls, *args, **kwargs)
名称 含义 备注
cls 当前类 类名,不可省略的参数。
*args 位置参数 创建实例位置参数,调用可省略,声明方法时不可省略。
**kwargs 关键字参数 创建实例位置参数,调用可省略,声明方法时不可省略。

 

返回值

__new__方法返回创建好的对象实例。

 

使用示例

使用__new__方法创建实例:

class Fun(object):    def __init__(self, fun):        self.fun = fun    def __new__(cls, *args, **kwargs):        return object.__new__(Fun)if __name__ == '__main__':    f = Fun.__new__(Fun)    print(type(f))

输出:

 

注意事项

__new__()方法只是创建实例,此时拿到的实例并不能正常使用。一个实例需要被__init__()方法初始化后才可以被正常使用。也就是说,正常场景下,我们生成一个类的实例,Python先调用该类的__new()__方法创建一个实例,然后再调用__init__()方法初始化该实例。__new()__方法存在于object方法中,通常情况下不需要被重载。

 

补充

可以使用__new__方法创建出其它类的实例。在这种场景下,__new__方法创建后会调用对应类的__init__方法完成初始化:

class Fun(object):    def __init__(self, fun):        self.fun = fun    def __new__(cls, *args, **kwargs):        return Demo(*args, **kwargs)class Demo(object):    def __init__(self, d):        self.demo = dif __name__ == '__main__':    f = Fun(1)    print("type f:", type(f))    print("f.demo:", f.demo)

运行结果:

type f: 
f.demo: 1

可以看出,f不是Fun类的一个实例,而是Demo类的一个实例,拥有Demo类的字段。因为Fun类的__new__方法创建的是一个Demo类实例,而非Fun类本身。因此Fun.__new__方法在return后调用了Demo.__init__方法,以完成该实例的初始化。

转载地址:http://tdsoi.baihongyu.com/

你可能感兴趣的文章
PHP开发框架的现状和展望
查看>>
不一样的敏捷开发实践
查看>>
为什么 FleaPHP 使用 Table Data Gateway 代替 Active Record 来提供数据库访问服务
查看>>
学习 REST
查看>>
FleaPHP 的 Ajax 支持和 WebControls
查看>>
无知者无畏!
查看>>
FleaPHP 开发指南 - 7. 数据表关联
查看>>
FleaPHP 开发指南 - 6. 访问数据库
查看>>
FleaPHP 开发指南 - 5. 应用程序设置
查看>>
FleaPHP 开发指南 - 4. 命名规范和目录结构
查看>>
FleaPHP 开发指南 - 3. 应用程序入口
查看>>
FleaPHP 开发指南 - 1. 开始前的准备工作
查看>>
实际采用 FleaPHP 的网站
查看>>
经常问到的问题 (FAQ)
查看>>
关于 FleaPHP
查看>>
Web MVC框架-命令及页面跳转
查看>>
Web MVC框架-视图模板查找及组织
查看>>
美丽的错误
查看>>
MVC框架视图及页面跳转分析-模板技术
查看>>
EasyJWeb+JPA(Hibernate3.2)+Spring2构架缓存技术
查看>>