zoukankan      html  css  js  c++  java
  • Python 特殊方法之slots

    1、slots简介

    Python中,每个类都会有实例属性,默认情况下Python会使用一个字典去保存一个对象的实例属性(对象.dict),这样就会让这个实例化的对象没有任何的限制,可以随意的给对象做任何属性设置,为了避免这个问题,我们可通过__slots__来限制实例对象的属性。

    1、所以slots是如何做到节约内存的?
    由于每次实例化一个对象都需要分配一个全新的dict,会浪费空间,如果有了slots,它只会分配一个元组,里面包括了当前能访问到的属性,因此类的实例只能拥有slots中定义的变量,而且不能再增加新变量。

    2、slots最终的目的是什么?
    最终目的---> 节约内存

    2、slots使用

    1.没有使用slots

    class User(object):
    
        def __init__(self, name, pwd, is_login=False):
            self.name = name
            self.pwd = pwd
            self.is_login = is_login
    
    u1 = User(name='root', pwd='123456', is_login=True)
    print(u1.__dict__) # {'name': 'root', 'pwd': '123456', 'is_login': True}
    u1.age = 30 # 随意的增加属性
    

    2.使用slots

    class User(object):
        # slots定义的元素必须是字符串类型
        __slots__ = ['name', 'pwd', 'is_login']
    
        def __init__(self, name, pwd, is_login=False):
            self.name = name
            self.pwd = pwd
            self.is_login = is_login
            
            
    u1 = User(name='root', pwd='123456', is_login=True)
    

    打印一下对象.__dict__,会发现dict已经不存在了,也就是类不会分配dict给实例化对象了

    print(u1.__dict__) # AttributeError: 'User' object has no attribute '__dict__'
    

    我们给对象设置属性,直接报错,不允许设置属性

    u1.age = 30 # AttributeError: 'User' object has no attribute 'age'
    

    3.如果我们需要预留新属性,可在slots里提前定义好属性

    class User(object):
        # 预留一个age属性,后续可以为该属性赋值
        __slots__ = ['name', 'pwd', 'is_login', 'age']
    
        def __init__(self, name, pwd, is_login=False):
            self.name = name
            self.pwd = pwd
            self.is_login = is_login
    
    
    u1 = User(name='root', pwd='123456', is_login=True)
    u1.age = 30 # 赋值预留属性
    print(u1.age)
    

    Note:使用slots要注意,slots定义的属性仅对当前类起作用,对继承的子类是不起作用的,除非子类也定义slots

  • 相关阅读:
    CentOS 7配置LNMP开发环境及配置文件管理
    Virtual Box配置CentOS7网络(图文教程)
    HTTP常用状态码分析
    MySQL数据库和InnoDB存储引擎文件
    InnoDB关键特性学习笔记
    InnoDB体系结构学习笔记
    Laravel 5.x 请求的生命周期(附源码)
    PyQt5 signal and slot
    x01.gamelab: An Tank 3D Model
    x01.AntWorld: An Python AI Game
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/13166940.html
Copyright © 2011-2022 走看看