美文网首页
【第28天】python全栈从入门到放弃

【第28天】python全栈从入门到放弃

作者: 36140820cbfd | 来源:发表于2019-08-19 20:58 被阅读0次

    1.initnew方法区别

    init初始化方法

    new构造方法(先构造出来,才能初始化)

    2.实例化一个方法都发生了什么?

    1开辟一个属于对象的空间,new方法

    2把对象的空间传给self,同时调用init方法

    3将这个对象的空间返回给调用者

    3 new构造方法

    new构造方法在什么时候执行:在实例化对象之后,在init初始化之前。

    代码块
    class Single:
    
        def __new__(cls, *args, **kwargs):
    
            obj=object.__new__(cls)
    
            print('在new方法里面',obj)
    
            return  obj
    
        def __init__(self):
    
            print('在init方法里面',self)
    
    a=Single()
    
    输出结果:
    
    在new方法里面 <__main__.Single object at 0x009E8E90>
    
    在init方法里面 <__main__.Single object at 0x009E8E90>
    

    4单例类

    定义:
    如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类

    代码块:不是单例类的例子
    class Student:
        print('hello')
    
    a=Student()
    b=Student()
    c=Student()
    print(a,b,c)
    #因为a,b,c三个的空间地址不一样,所以不是单例类,
    # 单例类是一个类只能由一个实例化的对象
    

    通过__ISINSTANCE=None来控制只能创造一个构造空间,无论实例化多少对象,后面都会把前面的覆盖,永远只有一开始创建的那个内存空间,这就是单例类的实现。

    代码块:单例类的例子
    class A:
    
        __ISINCTANCE = None
    
        def __new__(cls, *args, **kwargs):
    
            if not cls.__ISINCTANCE:
    
                cls.__ISINCTANCE = object.__new__(cls)
    
            return cls.__ISINCTANCE
    
        def __init__(self,name):
    
            self.name = name
    
            print(self)
    
    
    a=A('wangsiyu')    #<__main__.A object at 0x014E8ED0>
    
    b=A('mayun')        #<__main__.A object at 0x014E8ED0>
    
    print(b.name)        #mayun
    
    print(a.name)        #mayun
    
    print(a,b)          #  <__main__.A object at 0x014E8ED0> <__main__.A object at 0x014E8ED0>
    

    如果换成__ISINSTANCE=True,判断条件再把not去掉,就没有用了。

    就无法用__ISINSTANCE=None来限制创造构造空间的数量了

    代码块
    class A:
    
        __ISINCTANCE = True
    
        def __new__(cls, *args, **kwargs):
    
            if  cls.__ISINCTANCE:
    
                cls.__ISINCTANCE = object.__new__(cls)
    
            return cls.__ISINCTANCE
    
        def __init__(self,name):
    
            self.name = name
    
            print(self)
    
    
    a=A('wangsiyu')    #<__main__.A object at 0x014E8ED0>
    
    b=A('mayun')        #<__main__.A object at 0x014E8ED0>
    
    print(b.name)        #mayun
    
    print(a.name==b.name)        #False
    
    
    

    5__str__方法

    代码块
    class Student:
    
        def __str__(self):
            return '%s %s %s'%(self.school,self.cls,self.name)
    
        def __init__(self,name,stu_cls):
    
            self.school = 'oldboy'
    
            self.name = name
    
            self.cls = stu_cls
    
    a=Student('wangsiyu','ec14')
    
    print(a)  #oldboy ec14 wangsiyu
    

    print一个对象相当于调用一个对象的str方法

    str(obj),相当于执行obj.str方法

    '%s'%obj,相当于执行obj.str方法

    别跑,点个赞再走

    相关文章

      网友评论

          本文标题:【第28天】python全栈从入门到放弃

          本文链接:https://www.haomeiwen.com/subject/lfaesctx.html