python中的__init__ 、__new__、__call__小结
1.__new__(cls, *args, **kwargs) 创建对象时调用,返回当前对象的一个实例;注意:这里的第一个参数是cls即class本身
2.__init__(self, *args, **kwargs) 创建完对象后调用,对当前对象的实例的一些初始化,无返回值,即在调用__new__之后,根据返回的实例初始化;注意,这里的第一个参数是self即对象本身【注意和new的区别】
3.__call__(self, *args, **kwargs) 如果类实现了这个方法,相当于把这个类型的对象当作函数来使用,相当于 重载了括号运算符
看具体的例子:
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()
打印出来的是:
init
________
call
比如:Python Singleton(单例模式)实现,那我们是不是只是重载一些__new__方法就可以了
""" 重载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__方法,这时候已经生成了一个对象了,没办法实现单例模式
注意1、__init__并不相当于C#中的构造函数,执行它的时候,实例已构造出来了。
|
1
2
3
4
5
|
class A(object): def __init__(self,name): self.name=name def getName(self): return 'A '+self.name |
当我们执行
|
1
|
a=A('hello') |
时,可以理解为
|
1
2
|
a=object.__new__(A)A.__init__(a,'hello') |
即__init__作用是初始化已实例化后的对象。
注意2、子类可以不重写__init__,实例化子类时,会自动调用超类中已定义的__init__
|
1
2
3
4
5
6
7
|
class B(A): def getName(self): return 'B '+self.nameif __name__=='__main__': b=B('hello') print b.getName() |
但如果重写了__init__,实例化子类时,则不会隐式的再去调用超类中已定义的__init__
|
1
2
3
4
5
6
7
8
9
|
class C(A): def __init__(self): pass def getName(self): return 'C '+self.nameif __name__=='__main__': c=C() print c.getName() |
则会报"AttributeError: 'C' object has no attribute 'name'”错误,所以如果重写了__init__,为了能使用或扩展超类中的行为,最好显式的调用超类的__init__方法
|
1
2
3
4
5
6
7
8
9
|
class C(A): def __init__(self,name): super(C,self).__init__(name) def getName(self): return 'C '+self.nameif __name__=='__main__': c=C('hello') print c.getName() |
python中的__init__ 、__new__、__call__小结的更多相关文章
- Python中的__init__()和__call__()函数
Python中的__init__()和__call__()函数 在Python的class中有一些函数往往具有特殊的意义.__init__()和__call__()就是class很有用的两类特殊的函数 ...
- Python中的__init__,__call__
__init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...
- 007_Python中的__init__,__call__,__new__
__init__函数 当一个类实例被创建时, __init__() 方法会自动执行,在类实例创建完毕后执行,类似构建函数.__init__() 可以被当成构建函数,不过不象其它语言中的构建函数,它并不 ...
- python 中的__init__.py的用法与个人理解
使用Python模块常见的情况是,事先写好A.py文件,需要import B.py文件时,先拷贝到当前目录,然后再import 这样的做法在程序量较小的情况下是可行的,如果程序交互复杂程度稍高,就很费 ...
- python中的__init__(self)是什么意思呢
python中的__init__(self)是什么意思呢 init(self)这个时类的初始化函数 1 2 3 4 class Obj: def init(self): print 1 obj = O ...
- 【原创】Python 对象创建过程中元类, __new__, __call__, __init__ 的处理
原始type: type是最原始的元类,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple, attr ...
- Python中的__init__和__new__介绍
介绍 首先我们要知道在面向对象编程中,实例化基本遵循创建实例对象.初始化实例对象.最后返回实例对象这么一个过程. Python 中的 __new__ 方法负责创建一个实例对象,__init__ 方法负 ...
- Python中的__init__和__new__
一.__init__ 方法是什么? 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例的时候.例如: # -*- c ...
- python中的__init__和__new__的区别
一.__init__ 方法是什么?(init前后的线是双下划线) 使用Python写过面向对象的代码的同学,可能对 __init__ 方法已经非常熟悉了,__init__ 方法通常用在初始化一个类实例 ...
随机推荐
- Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object
本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...
- 一次流量稍高导致web项目慢的问题&解决
项目上线后,用户越来越多,有一天出现一个issue:用户访问特别慢. 首先介绍下架构: haproxy/Nginx / \ node1 node2 | | redis redis(slave) | | ...
- Android WebView Demo
activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android& ...
- fedora Server 21 安装 Opera 29.0.1795.47
最新文章:Virson's Blog 安装源: yum localinstall --nogpgcheck http://mirror.yandex.ru/fedora/russianfedora/r ...
- Cocos2d-JS项目之一:环境(IDE 运行js-tests、IDE 和 studio 统一工程)
环境:cocos 引擎(包括 studio)2.2.1 for Mac.cocos2d-js-v3.5.Cocos Code IDE 1.2 for Mac,cocos 引擎指的是下面这个东西: 各种 ...
- HDU 3999 The order of a Tree
The order of a Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- MySQL实现类似Oracle的序列
MySQL实现类似Oracle的序列 2013-10-22 10:33:35 我来说两句 作者:走过的足迹 收藏 我要投稿 MySQL实现类似Oracle的序列 Oracl ...
- [原]编译Android源码过程中遇到的问题
编译Android源码的过程参考Android官网介绍: 1.下载Android源码的步骤:https://source.android.com/source/downloading.html 2.编 ...
- TFS Build Silverlight项目的两个问题
1.The Silverlight 4 SDK is not installed. 打开对应的Build Definition,Process -> Advanced -> MSBuild ...
- Android UI开发第四十二篇——实现实现易信的圆形图像和对话列表的图像显示部分
显示图像时,很多个性化显示,圆形或圆角.气泡等等,我们这一篇文章探讨一下圆形和气泡的显示,仿照易信中的实现,先看下效果图: 代码: public class RoundImageView extend ...