前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Py测开《内置属性__slots__》

Py测开《内置属性__slots__》

作者头像
清菡
发布2022-04-27 19:25:52
2860
发布2022-04-27 19:25:52
举报
文章被收录于专栏:清菡软件测试清菡软件测试

目录

  • 一、内置属性__slots__
    • 1.如果没有这句__slots__ = ['name']代码,正常情况下是可以添加属性的。
    • 2.写了属性限制。
    • 3.现在只能添加name这一个属性。
    • 4.如果这个__slots__ = ['name']没写,它会有个__dict__属性。
    • 5.如果写了__slots__ = ['name'],这个__dict__属性就不会存在。
  • 二、__slots__ 的作用。
    • 1.限制类对象的属性,只能添加哪些属性。
    • 2.节约内存。
  • 三、定义多个属性。
    • 1.初始化多个。
    • 2.不需要初始化的,动态添加多个。

一、内置属性__slots__

自己定义一个类,事先定义一个__slots__属性,创建一个对象的时候,这个对象就不会自动生成__dict__属性了。这个是关于节约内存方面的东西。

__slots_:限制对象的属性。 指定类对象所能绑定的属性__slots__ = []

1.如果没有__slots__ = ['name']这句代码,正常情况下是可以添加属性的:

代码语言:javascript
复制


# __slots_
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # __slots__ = ['name']
    pass
b=Base()
b.age=200

运行结果

2.写了属性限制:

代码语言:javascript
复制
# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    __slots__ = ['name']
    pass
b=Base()
b.age=200

运行结果

不能添加age属性。

3.现在只能添加name这一个属性:

代码语言:javascript
复制
# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    __slots__ = ['name']
    pass
b=Base()
# b.age=200

b.name="qinghan"

运行结果

只能添加这个属性不会报错,如果添加其它的属性,添加不上。

4.如果这个__slots__ = ['name']没写,它会有个__dict__属性:

代码语言:javascript
复制
# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # __slots__ = ['name']
    pass
b=Base()
# b.age=200

b.name="qinghan"
print(b.__dict__)

运行结果

5.如果写了__slots__ = ['name'],这个__dict__属性就不会存在:

代码语言:javascript
复制
# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    __slots__ = ['name']
    pass
b=Base()
# b.age=200

b.name="qinghan"
print(b.__dict__)

运行结果

二、__slots__ 的作用

1.限制类对象的属性,只能添加哪些属性。 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。

1.如果写了__slots__ = ['name'],这个和实例化有冲突。

代码语言:javascript
复制


# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # 1.限制类对象的属性,只能添加哪些属性。
    # 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
    __slots__ = ['name']

    def __init__(self,name,age):
        self.name=name
        self.age=age
    pass
b=Base("qinghan","18")
# b.age=200

# b.name="qinghan"
# print(b.__dict__)

运行结果

init方法报错了。限定之后,只能为这个对象绑定这个属性,其它的属性再也绑定不上去了。

2.节约内存

通过这个类创建了一个对象,这个时候Python会自动生成一个__dict____dict__是个字典,关于字典的话,首先它会划出一块比较大的空间。

图例

接下来往里面添加属性,每绑定一个属性,就会记录到__dict__里面。每生成一个对象,就会划一个区间存这个对象的__dict__属性。

比如自动化用例,假如有成千上万条用例,然后全部赋值到对象身上去,这个时候它会划成千上万块区间存储每个对象的__dict__属性。

图例

创建的对象越多,占用的内存越多。在类里面定义slots属性,通过这个类创建对象的时候,这个对象的属性已经限定在slots里面了。

不管是哪个对象,它的属性都只能是这个属性,这个时候只需要一个slots储存所有对象的属性。

所有对象的属性都用slots限制了。当你访问这个属性的时候,属性就在slots里面,slots给你指向对应的属性值。对应的对象,对应的slots属性值。

__dict__相对于slots,消耗内存是非常大的。定义slots之后,就不会自动创建__dict__了。

所以创建一个类的时候,知道这个类有多少个属性。这个类创建的对象有多少个属性,在后面不会动态添加属性的情况下,就通过 __slots__来限定类的属性。前提是后续不会对这个类进行动态属性添加。这种情况下,进行内存的优化。

三、定义多个属性

定义多个属性:__slots__ = ['name','age','gender']

1.初始化多个

代码语言:javascript
复制


# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # 1.限制类对象的属性,只能添加哪些属性。
    # 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
    __slots__ = ['name','age','gender']

    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender

    pass
b=Base("qinghan","18","ceshi")
# b.age=200

# b.name="qinghan"
# print(b.__dict__)

运行结果

2.不需要初始化的,动态添加多个

代码语言:javascript
复制


# __slots__
#限制对象的属性。

class Base(object):
    #指定类对象所能绑定的属性。
    # 1.限制类对象的属性,只能添加哪些属性。
    # 2.节约内存:定义了slots属性之后,那么该对象不会再自动生成__dict__属性。
    __slots__ = ['name','age','gender']

    # def __init__(self,name,age,gender):
    #     self.name=name
    #     self.age=age
    #     self.gender=gender

    pass
# b=Base("qinghan","18","ceshi")
b=Base()
b.age=200
b.name="qinghan"
b.gender="ceshi"

# b.name="qinghan"
# print(b.__dict__)

运行结果

除标明“图片来自网络”的图片,其它文章中的图片皆为本人所画,计算机知识都一样,如有雷同,纯属巧合。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 清菡软件测试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
    • 一、内置属性__slots__
      • 1.如果没有__slots__ = ['name']这句代码,正常情况下是可以添加属性的:
      • 2.写了属性限制:
      • 3.现在只能添加name这一个属性:
      • 4.如果这个__slots__ = ['name']没写,它会有个__dict__属性:
      • 5.如果写了__slots__ = ['name'],这个__dict__属性就不会存在:
    • 二、__slots__ 的作用
      • 1.如果写了__slots__ = ['name'],这个和实例化有冲突。
      • 2.节约内存
    • 三、定义多个属性
      • 1.初始化多个
      • 2.不需要初始化的,动态添加多个
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档