Py测开《内置属性__slots__》

2022-04-27 19:25:52 浏览数 (1)

目录

  • 一、内置属性__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__)

运行结果

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

0 人点赞