zoukankan      html  css  js  c++  java
  • python类的__slots__属性、__del__属性、上下文(__enter__和__exit__)、

    常规情况下,类的属性字典是共享的,而实例的字典是独立的。如果一个类的属性较少,但是拥有很多的实例,这些实例的属性字典会占用较多的内存空间。对这样的类来说,为了节省内存空间,可以使用__slots__类变量代替__init__()来存储数据属性。

    定义__slots__之后,系统会为实例使用一种更加紧凑的内部表示,即通过一个很小的固定大小的数组来构建,而不是为每一个实例定义一个字典。

    __slots__可以是列表、元组、字符串等可迭代对象

    定义__slots__之后,类保留有__dict__,但实例没有,取代的是__slots__,且实例不能增加__slots__定义之外的属性。

    class animal:
        __slots__ = ('name','age')
        def eat(self):
            print('%s is eating'%self.name)
    
    cat=animal()
    print(animal.__dict__)#类还是有__dict__的
    # print(cat.__dict__)会报错,实例已经没有__dict__字典了
    print(cat.__slots__)  #('name', 'age'),只返回数据属性名称,不返回对应的值
    cat.eat()
    #cat.sex='male'会报错,不能为实例增加除了__slots__定义之外的属性了

    __del__析构函数,在实例被删除、或者整个python文件执行完毕后自动执行,释放空间。

    class test:
        def __init__(self,name):
            self.name=name
        def __del__(self):
            print('我执行啦')
    
    test1=test('haha')
    del test1.name
    print('------------')
    # ------------
    # 我执行啦

    __enter__和__exit__

    在通过类()对类实例化时,触发类的__enter__方法,操作错误或完毕触发__exit__方法

    描述符:在一个类中,定义一个类属性为另一个类的实例,如下在B类中定义类属性x值为A的实例,则A类为描述符。

    描述符中可定义__get__方法,获取值时触发,__set__方法,设置值时触发,__delete__删除值时触发。

    如果A类中实现了__get__和__set__方法,那么A为数据描述符,如果没有实现__set__方法则为非数据描述符。

    class A:
        pass
    class B:
        x=A()

    优先级:类属性>数据描述符>实例属性>非数据描述符>找不到

  • 相关阅读:
    阿里P8架构师谈:阿里双11秒杀系统如何设计?
    秒杀系统设计的知识点
    秒杀系统架构优化思路
    秒杀系统解决方案
    Entity Framework Code First (七)空间数据类型 Spatial Data Types
    Entity Framework Code First (六)存储过程
    Entity Framework Code First (五)Fluent API
    Entity Framework Code First (四)Fluent API
    Entity Framework Code First (三)Data Annotations
    Entity Framework Code First (二)Custom Conventions
  • 原文地址:https://www.cnblogs.com/Forever77/p/10100066.html
Copyright © 2011-2022 走看看