python中的__init__ 、__new__、__call__小结

时间:2021-07-19 20:10:38 

1.__new__(cls, *args, **kwargs)  创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身
2.__init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身【注意和new的区别】
3.__call__(self,  *args, **kwargs) 如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符
 

看具体的例子:


class O(object):

    def __init__(self, *args, **kwargs):
        print "init"
        super(O, self).__init__(*args, **kwargs)

    def __new__(cls, *args, **kwargs):
        print "new", cls
        return super(O, cls).__new__(cls, *args, **kwargs)

    def __call__(self,  *args, **kwargs):
        print "call"
      

    oo = O()
    print "________"
    oo() 

打印出来的是:


new
init
________
call


比如:Python Singleton(单例模式)实现,那我们是不是只是重载一些__new__方法就可以了


class Singleton1(object):
    """ 重载new方法"""
    def __new__(cls, *args, **kwargs):
        if not "_instance" in vars(cls):
            cls._instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
        return cls._instance


可不可以重载__init__方法呢?明显不可以,因为__init__之前调用了__new__方法,这时候已经生成了一个对象了,没办法实现单例模式

标签:python,init,new,call
0
投稿

猜你喜欢

  • Python通过正则库爬取淘宝商品信息代码实例

    2021-12-09 18:49:55
  • 异步任务队列Celery在Django中的使用方法

    2023-08-03 06:26:39
  • 浏览器用户体验:Firefox初体验 VS The world

    2008-08-02 11:58:00
  • python日记(使用TCP实现的对话客户端和服务器)

    2023-01-25 19:42:54
  • oracle行转列方法集合汇总(推荐!)

    2024-01-12 19:42:14
  • Python Cookie 读取和保存方法

    2021-01-21 15:57:51
  • Python基于socket实现TCP客户端和服务端

    2023-09-29 15:30:05
  • 微信小程序实现点击导航标签滚动定位到对应位置

    2024-05-10 13:59:17
  • 在pyqt5中展示pyecharts生成的图像问题

    2023-10-17 10:59:46
  • 详解Python静态网页爬取获取高清壁纸

    2023-10-18 08:27:42
  • 在Mysql存储过程中使用事务实例

    2024-01-21 18:45:43
  • Python函数和模块的使用详情

    2023-10-11 13:51:20
  • MySQL乱码问题深层分析

    2009-03-09 14:53:00
  • pyCharm 实现关闭代码检查

    2023-05-14 18:48:01
  • Anaconda+vscode+pytorch环境搭建过程详解

    2022-04-06 01:37:19
  • MySQL百万级数据量分页查询方法及其优化建议

    2024-01-17 20:56:11
  • 使用python的pandas为你的股票绘制趋势图

    2023-12-29 19:48:46
  • Python中lambda的用法及其与def的区别解析

    2021-09-22 13:59:03
  • MySQL的 DDL和DML和DQL的基本语法详解

    2024-01-15 06:40:43
  • 打造设计你自己的字体 Ⅱ

    2008-03-14 07:48:00
  • asp之家 网络编程 m.aspxhome.com