__init__函数

当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数。__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不创建实例--它仅仅是你的对象创建后执行的第一个方法。它的目的是执行一些该对象的必要的初始 化工作。通过创建自己的 __init__() 方法,你可以覆盖默认的 __init__()方法(默认的方法什么也不做),从而能够修饰刚刚创建的对象__init__()需要一个默认的参数self,相当于this。

__call__函数

Python中有一个有趣的语法,只要定义类型的时候,实现__call__函数,这个类型就成为可调用的。

换句话说,我们可以把这个类的对象当作函数来使用,相当于重载了括号运算符。为了弄明白python中__setattr__, __getattr__, __delattr__, __call__的作用,重写dict,扩展其功能。

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. #
  4. # Copyright 2015 mimvp.com
  5.  
  6. class MyDict(dict):
  7. '''
  8. 通过使用__setattr__, __getattr__, __delattr__
  9. 可以重写dict,使之通过“.”调用
  10. '''
  11.  
  12. def __init__(self):
  13. super(MyDict, self).__init__()
  14.  
  15. def __setattr__(self, key, value):
  16. self[key] = value
  17.  
  18. def __getattr__ (self, key):
  19. try:
  20. return self[key]
  21. except KeyError, e:
  22. print '__getattr__ error_msg: %r' % e
  23. return None
  24.  
  25. def __delattr__ (self, key):
  26. try:
  27. del self[key]
  28. except KeyError, e:
  29. print '__delattr__ error_msg: %r' % e
  30. return None
  31.  
  32. def __call__ (self, key):
  33. ''' 用于实例自身的调用, 达到()调用的效果 '''
  34. try:
  35. return self[key]
  36. except KeyError, e:
  37. print '__delattr__ error_msg: %r' % e
  38. return None
  39.  
  40. def main():
  41. s = MyDict()
  42. s.name = "mimvp.com" # 这是__setattr__起的作用
  43. print "s('name') : %s" % s('name') # 这是__call__起的作用
  44. print "s['name'] : %s" % s['name'] # dict默认行为
  45. print "s.name : %s" % s.name # 这是__getattr__起的作用
  46.  
  47. del s.name # 这是__delattr__起的作用
  48. print "s.name2 : %s" % s.name # 这是__getattr__起的作用
  49.  
  50. if __name__ == '__main__':
  51. main()
  52. print("end.")

运行结果:

s('name') : mimvp.com
s['name'] : mimvp.com
s.name : mimvp.com
__getattr__ error_msg: KeyError('name',)
s.name2 : None
end.

-------------

Python中的__init__ 、__new__、__call__小结

1.__init__(self, *args, **kwargs)

创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意这里的第一个参数是self,即对象本身(注意和new的区别)

2.__new__(cls, *args, **kwargs) 

创建对象时调用,返回当前对象的一个实例,注意这里的第一个参数是cls即class本身

3.__call__(self,  *args, **kwargs)

如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符

具体例子:

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. #
  4. # Copyright 2015 mimvp.com
  5. class MyClass(object):
  6. def __init__(self, *args, **kwargs):
  7. print "init"
  8. super(MyClass, self).__init__(*args, **kwargs)
  9. def __new__(cls, *args, **kwargs):
  10. print "new", cls
  11. return super(MyClass, cls).__new__(cls, *args, **kwargs)
  12. def __call__(self, *args, **kwargs):
  13. print "call"
  14. def main():
  15. myclass = MyClass()
  16. myclass()
  17. if __name__ == '__main__':
  18. main()
  19. print("end.")

运行结果:

new <class '__main__.MyClass'>
init
call
end.

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

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

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

参考:http://blog.mimvp.com/2015/01/python-initcallnew/

http://www.cnblogs.com/lovemo1314/archive/2011/04/29/2032871.html

007_Python中的__init__,__call__,__new__的更多相关文章

  1. python中的__init__ 、__new__、__call__小结

    这篇文章主要介绍了python中的__init__ .__new__.__call__小结,需要的朋友可以参考下 1.__new__(cls, *args, **kwargs)  创建对象时调用,返回 ...

  2. 简述 Python 类中的 __init__、__new__、__call__ 方法

    任何事物都有一个从创建,被使用,再到消亡的过程,在程序语言面向对象编程模型中,对象也有相似的命运:创建.初始化.使用.垃圾回收,不同的阶段由不同的方法(角色)负责执行. 定义一个类时,大家用得最多的就 ...

  3. 详解python中的__init__与__new__方法

    一.__init__和__new__方法执行的顺序? 在面向对象中介绍了关于对象创建的过程,我们知道__new__方法先于__init__方法执行. 二.__new__方法是什么? 首先,我们先来看下 ...

  4. Python中的__init__和__new__

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- c ...

  5. python中的__init__和__new__的区别

    一.__init__ 方法是什么?(init前后的线是双下划线) 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例 ...

  6. 详解Python中的__init__和__new__(静态方法)

    一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: #-*- co ...

  7. 详解Python中的__init__和__new__

    转载:https://my.oschina.net/liuyuantao/blog/747164 1.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ ...

  8. python类中的__init__和__new__方法

    Python中类: Python中在创建类的过程中最先调用的不是__init__方法而是__new__方法,__new__方法是一个静态方法,在创建一个类对象时其实是通过__new__方法首先创建出一 ...

  9. python中的__init__ 、__new__、__call__等内置函数的剖析

    1.__new__(cls, *args, **kwargs)   创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身2.__init__(self, *args, ...

随机推荐

  1. 51单片机定时器实现LED闪烁

    要启用一个定时器,先要开启定时器,然后产生中断 系统中断: 初始化程序应完成如下工作: 对TMOD赋值,以确定T0和T1的工作方式. 计算初值,并将其写入TH0.TL0或TH1.TL1. 中断方式时, ...

  2. 你还在等着用户反馈BUG?

    译者按: 等待用户反馈BUG,一切都晚了!实时监控线上应用才是王道. 原文: Why relying on your users to report errors is the dumbest thi ...

  3. Git命令使用小结

    一.上传你的代码的基本方式 0.在github网站上登录你的账户cynthiawupore,然后新建一个仓库demo 1.初始化 $ git init 2.添加文件夹下所有文件到仓库 $ git ad ...

  4. Android绘制优化(一)绘制性能分析

    前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...

  5. WPF:自定义Metro样式文件夹选择对话框FolderBrowserDialog

    1.前言 WPF并没有文件选择对话框,要用也就只有使用Winform版的控件.至今我也没有寻找到一个WPF版本的文件选择对话框. 可能是我眼浊,如果各位知道有功能比较健全的WPF版文件选择对话框.文件 ...

  6. spark查看DF的partition数目及每个partition中的数据量【集群模式】

    println("--------------------"+data.rdd.getNumPartitions) // 获取DF中partition的数目 val partiti ...

  7. 通过linkserver不能调远程表值函数

    Question: 通过linkserver调远程表值函数报错如下 Solution: 注意:查询语句中的[SDS_NONEDI].[DBO].ddddd(),不能加server名[sdsc2-1]. ...

  8. Vue2 学习笔记3

    文中例子代码请参考github 定义Vue组件 什么是组件: 组件的出现,就是为了拆分Vue实例的代码量的,能够让我们以不同的组件,来划分不同的功能模块,将来我们需要什么样的功能,就可以去调用对应的组 ...

  9. 利用python搭建Powersploit powershell脚本站点

    powershell脚本站点的搭建 一.Powersploit Powersploit是一款基于powershell的后渗透(Post-Exploitation)框架,集成大量渗透相关模块和功能. 下 ...

  10. Docker详细介绍安装与镜像制作和拉取

    一.Docker是什么? 产生背景: 开发和运维之间因为环境不同和导致的矛盾(不同的操作系统.软件环境.应用配置等)DevOps 代码.系统.环境.配置等封装成镜像Image--->运维: 集群 ...