python中的__init__ 、__new__、__call__小结

实例传过来, self隐式的将, @property 修饰,带修饰类方法,、,、

C:\Python27\python.exe D:/weixin/temp/abc.py
__new__
what?
__init__

Process finished with exit code 0
class A():
    def func(self,x,y):
        return x * y

    @classmethod
    def cfunc(cls,x,y):
        return x * y

if __name__=="__main__":
    print A().func(5,5)
    print A.cfunc(4,5)

python中的__init__ 、__new__、__call__小结,__init___new__

这篇小说首要介绍了python中的__init__
、__new__、__call__总括,须求的爱侣能够参照下

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__办法,那时候已经变化了1个对象了,不能够得以落成单例情势

===========================================  

注意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.name   if __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.name   if __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.name   if __name__=='__main__':     c=C('hello')        print c.getName()    

、__new__、__call__小结,__init___new__
那篇小说主要介绍了python中的__init__
、__new__、__call__小结,须要的情侣能够参见下 1.__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

 

三、@staticmethod
 修饰类的法子

但如果重写了__init__,实例化子类时,则不会隐式的再去调用超类中已定义的__init__

一齐前行,与君共勉,

1、@property  
将某函数,做为属性使用

new
init
________
call

__new__(cls),cls是隐式的传递的类对象,并不是实例。因为__new__的任务正是,创设类实例并重回实例。

 

1
a=A('hello')

Linux and
python学习交换壹,2群已满.

class A():


    @property
    def pfunc(self):
        return self.value

    @pfunc.setter
    def pfunc(self,value):
        self.value = value

    @property
    def pfunc1(self):
        print('this is property')

if __name__=="__main__":

    A.pfunc = 9
    print A.pfunc
    A.pfunc1

复制代码 代码如下:

不前进,不倒退,停止的景况是未曾的.

带修饰类方法:cls做为方法的率先个参数,隐式的将类做为对象,传递给艺术,调用时决不实例化。

复制代码 代码如下:

Linux and
python学习沟通3群新开,应接加入,一同学习.qq 叁群:5632278九肆

 二)使用修饰服,修饰方法,不需求实例化

    oo = O()
    print “________”
    oo() 

__init__与__new__区别:

常见函数方法:self做为第3个参数,隐式的将类实例传递给艺术,调用方法时,类必须实例化。

即__init__功用是初叶化已实例化后的目的。