__init__函数

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

__call__函数

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

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

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Copyright 2015 mimvp.com class MyDict(dict):
'''
通过使用__setattr__, __getattr__, __delattr__
可以重写dict,使之通过“.”调用
''' def __init__(self):
super(MyDict, self).__init__() def __setattr__(self, key, value):
self[key] = value def __getattr__ (self, key):
try:
return self[key]
except KeyError, e:
print '__getattr__ error_msg: %r' % e
return None def __delattr__ (self, key):
try:
del self[key]
except KeyError, e:
print '__delattr__ error_msg: %r' % e
return None def __call__ (self, key):
''' 用于实例自身的调用, 达到()调用的效果 '''
try:
return self[key]
except KeyError, e:
print '__delattr__ error_msg: %r' % e
return None def main():
s = MyDict()
s.name = "mimvp.com" # 这是__setattr__起的作用
print "s('name') : %s" % s('name') # 这是__call__起的作用
print "s['name'] : %s" % s['name'] # dict默认行为
print "s.name : %s" % s.name # 这是__getattr__起的作用 del s.name # 这是__delattr__起的作用
print "s.name2 : %s" % s.name # 这是__getattr__起的作用 if __name__ == '__main__':
main()
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)

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

具体例子:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Copyright 2015 mimvp.com
class MyClass(object):
def __init__(self, *args, **kwargs):
print "init"
super(MyClass, self).__init__(*args, **kwargs)
def __new__(cls, *args, **kwargs):
print "new", cls
return super(MyClass, cls).__new__(cls, *args, **kwargs)
def __call__(self, *args, **kwargs):
print "call"
def main():
myclass = MyClass()
myclass()
if __name__ == '__main__':
main()
print("end.")

运行结果:

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

比如: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__方法,这时候已经生成了一个对象了,没办法实现单例模式

参考: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. 1.创建和销毁对象_EJ

    在这里记录<Effective Java>学习笔记.该书介绍了java编程中70多种极具实用价值的经验规则,揭示了该做什么,不该做什么才能产生清晰.健壮和高效的代码. 第1条: 考虑用静态 ...

  2. git方式安装thinkphp5

    1.thinkphp 的github 代码版本地址:https://github.com/top-think 2. 点击think 复制 地址 3. 新建thinkphp5 文件夹 git clone ...

  3. 关于openSetting通过tap的调用

    问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本 API和组件 小程序 Bug openSetting 工具 6.7.2 2.3.0 - 当前 Bug 的表现(可附上截图 ...

  4. 4种方法实现Html转码

    <script> var HtmlUtil = { /*1.用浏览器内部转换器实现html转码*/ htmlEncode: function(html) { //1.首先动态创建一个容器标 ...

  5. 个人练习:使用HTML+CSS制作二级菜单

    最近一直在学习HTML+CSS,刚看完如果制作下拉菜单部分,就想着做一个练练手. 先上成品图: 就是上面这个效果,横向菜单选项能点击,鼠标放在上面也能展开二级菜单,二级菜单也能点击,点击后就会在底下的 ...

  6. Jedis 简单案例

    POM 依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> < ...

  7. Python 一键拉取Git分支源码自动解析并执行SQL语句

    基于Python实现自动拉取Git分支源码自动解析并执行SQL语句 by:授客 QQ:1033553122 1.代码用途 开发过程中,研发人员会提交SQL更新脚本到Git源码库,然后测试负责去拉取这些 ...

  8. 图说Oracle基础知识(一)

    本文主要对Oralce数据库操作的基础知识进行一下梳理,以便进行归纳总结.适用于未使用过Oracle数据库的读者,或需要学习Oracle数据库方面的基础知识.如有不足之处,还请指正. 关于SQL介绍的 ...

  9. Html:html是什麽、html文件结构

    相关内容: html是什麽 html文件结构 首发日期:2018-02-12 html是什么: hmtl超文本标记语言,标准通用标记语言下的一个应用. html专门用于网页,它的“标志符”告诉了浏览器 ...

  10. [20180810]exadata--豆腐渣系统的保护神.txt

    [20180810]exadata--豆腐渣系统的保护神.txt --//最近一段时间,一直在看exdata方面的书籍,我个人的感觉exadata并非善长oltp系统,能通过OLTP获得好处的就算ex ...