• 内置方法 new-del


    __new__ 构造方法 生产对象的时候用的  ------单例模式

    __del__析构方法 在删除一个对象之前用到的 --------归还操作系统资源

    class Foo(object):
        def __new__(cls, *args, **kwargs):
            print('in new') # 先执行
            obj = object.__new__(cls)  #self 在这里被创造出来的
            print(obj)           #  <__main__.Foo object at 0x032222B0>
            return obj
        def __init__(self):
            print('init',self)# 后执行   #   init <__main__.Foo object at 0x032222B0>
    Foo()
    # 实例化一个对象时
    # 先开辟一个属于这个对象的空间,并在这个空间存放一个类指针,这时要用的new,
    # 如果自己没有new,就用object的new


    class A: pass
    a1 = A()
    a2 = A()    #对象地址不相同,说明有两个实例,不是单例模式
    print(a1)   #<__main__.A object at 0x006221D0>
    print(a2)   #<__main__.A object at 0x00622230>
    # 设计模式 - 单例模式
    # 一个类有且只能由一个实例
    # 下面就让我们来实现单例模式
    class A:
        __flag = None
        def __new__(cls, *args, **kwargs):
            if cls.__flag is None:
                cls.__flag = object.__new__(cls)
                return cls.__flag
        def __init__(self,name=None,age=None):
            self.name = name
            if age:
                self.age = age
    a1 = A('alex',84)
    # print(a1)
    # a2 = A('alex',56)
    # print(a2)
    a3 = A('alex')
    print(a3)          # None
    print(a1.age)      # 84

    这样做保证了一个类无论被实例化多少次,都只开辟一次空间,第一使用的是同一块内存地址

    如果我们想控制实例化的次数呢?

    我这里做了控制实例化次数为4,如下

    class A(object):
    
        __flag = []
        __count = 0
    
        def __new__(cls, *args, **kwargs):
            if cls.__count<4:
                cls.__flag = object.__new__(cls)
                cls.__count+=1
                print(cls.__flag)
            return cls.__flag
    
        def __init__(self,name,age):
            self.name = name
            self.age = age
        @classmethod
        def getsize(cls):
            return cls.__flag
    
    a1 = A('alex',22)
    a2 = A('wangsir',23)
    a3 = A('evaj',24)
    a4 = A('bg',25)
    a5 = A('tb',26)
    a6 = A('tb1',262)
    print(a5.age)
    print(A.getsize())

    此时前3次实例化对象地址都是各自是各自的,第4次到第6次实例化的对象地址都是第4个的,但他们的值都是按照第6个实例化对象的值取

    如果这么理解不明白的话,换一种说法,前3次都是正常的实例化,第四次开始,就实现了一个单例模式,如果不懂单例模式,可以看看上面

    我写的

    #python 解释器

    # 1.我们主动删除 del obj
    # 2.python解释器周期性删除
    # 3.在程序结束之前 所有内容都需要清空

    import time
    class A:
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def __del__(self):
            # 只和del obj语法有关系,在执行del obj之前回来执行一下__del__中内容
            print('执行我了')
    a = A('alex',84)
    print(a.name)
    print(a.age)
    del a
    # time.sleep(1)
    #在所有的代码执行完毕后,所有的值都会被python解释器回收
    # import time
    # class A:
    #     def __init__(self,path,mode='GBK'):
    #         self.f = open(path,'w')
    #     def __del__(self):
    #         '''
    #         归还一些错做系统资源的时候使用
    #         包括文件网络数据库连接
    #         '''
    #         self.f.close()
    # a = A('userinfo')
    # time.sleep(1)
  • 相关阅读:
    mysql 官网下载,以及安装配置
    SQL 完美解决用逗号分隔存放在一个字段数据
    centos7 开机自动执行shell脚本
    ansible 通过shell脚本执行MySQL语句
    查找让mysql cpu达到100%的罪魁祸首
    查看mysql数据库容量大小
    docker安装zabbix-proxy
    docker zabbix 环境变量
    zabbix 时区不对-误差5个小时--持续更新
    zabbix钉钉告警
  • 原文地址:https://www.cnblogs.com/CNHK1949/p/10644725.html
Copyright © 2020-2023  润新知