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

  • 相关阅读:
    CF763C Timofey and Remoduling
    CF762E Radio Stations
    CF762D Maximum Path
    CF763B Timofey and Rectangles
    URAL1696 Salary for Robots
    uva10884 Persephone
    LA4273 Post Offices
    SCU3037 Painting the Balls
    poj3375 Network Connection
    Golang zip压缩文件读写操作
  • 原文地址:https://www.cnblogs.com/jasonminghao/p/13166940.html
Copyright © 2011-2022 走看看