实例传过来必威手机官网:,带修饰类方法

__new__在python中实际是,在实例化早前施行的,那些通过参数同样能够看看

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、__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 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

if __name__ == '__main__':
    piglei = Person('piglei', 24)
    print piglei
实行结果:

 

Linux and python学习交流1,2群已满.

因为类每三遍实例化后产生的进程都以透过__new__来支配的,所以经过重载__new__方式,我们能够很简单的达成单例方式。

一块发展,与君共勉,

1)是把函数嵌入到类中的风流倜傥种方式,函数就归属类,同有的时候间表明函数无需拜访这些类

i = PositiveInteger(-3)
print i
但运营后会开掘,结果根本不是我们想的那样,大家任然得到了-3。那是因为对此int这种 不可变的对象,大家唯有重载它的__new__主意工夫起到自定义的意义。

 

 

p = Person(name, age)
先是实践使用name和age参数来举行Person类的__new__方法,这个__new__措施会 再次回到Person类的二个实例(日常情状下是行使 super(Persion, cls).__new__(cls, ... ...) 那样的办法卡塔 尔(阿拉伯语:قطر‎,
接下来利用那个实例来调用类的__init__办法,上一步里面__new__发生的实例也正是 __实例传过来必威手机官网:,带修饰类方法。init__里面的的 self
所以,__init__ 和 __new__ 最重大的区分在于:

 

 

# -*- coding: utf-8 -*-

Linux and python学习交换3群新开,招待插足,一同学习.qq 3群:563227894

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

第意气风发大家来看一下首个职能,具体大家得以用int来作为叁个例证:

C:Python27python.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


    @staticmethod
    def sfunc(x,y):
        return x * y


if __name__=="__main__":

    print A.sfunc(6,5)

class PositiveInteger(int):
    def __init__(self, value):
        super(PositiveInteger, self).__init__(self, abs(value))

不前进,不倒退,甘休的情状是从未的.

Linux and python学习沟通3群新开,接待参加,一同学习.qq 3群:563227894

__new__ 方法是如何?
__new__主意接收的参数即使也是和__init__一样,但__init__是在类实例创设之后调用,而 __new__办法正是制造那几个类实例的方法。

留神一些,通过参数会怀有发掘,其实__init__(self)  self隐式的将,实例传过来。

 

利用Python写过面向对象的代码的同桌,恐怕对 __init__ 方法已经极其纯熟了,__init__ 方法日常用在初步化多个类实例的时候。举个例子:

本文由必威发布于必威-编程,转载请注明出处:实例传过来必威手机官网:,带修饰类方法

相关阅读