您的位置:首页 > 编程语言 > Python开发

python slots 内存管理

2018-05-24 14:57 211 查看
__slots__的用法主要是为了优化内存。

#!/usr/bin/env python
# -*- coding:UTF-8 -*-


'''使用__slots__属性'''
class Test1(object):
    __slots__ = ('attr1')



print('\nThis is Test1\n')


test1_a = Test1()
test1_a.attr1 = ["I'm instance test1_a"]
print('test1_a.attr1 = ', test1_a.attr1)

test1_b = Test1()
test1_b.attr1 = ["I'm instance test1_b"]
print('test1_a.attr1 = ', test1_a.attr1) #这里类未绑定属性,不发生改变           注释(1)
print('test1_b.attr1 = ', test1_b.attr1)

Test1.attr1 = ["Hello World"]
print('\nTest1 speak:Follow me change!') #这里添加类属型,实例属性发生改变   注释(2)
print('Test1.attr1 =', Test1.attr1)
print('test1_a.attr1 = ', test1_a.attr1)

print('test1_b.attr1 = ', test1_b.attr1)

test1_a.attr1.append("I have changed……")
print('\ntest1_a speak:Follow me change!') #这里实例修改属性,所有实例发生变化  注释(3)
print('Test1.attr1 =', Test1.attr1)
print('test1_a.attr1 = ', test1_a.attr1)
print('test1_b.attr1 = ', test1_b.attr1)


test1_b.attr1.append("I have changed……")
print('\ntest1_b speak:Follow me change!') #另一个实例改变属性值  注释(3)
print('Test1.attr1 =', Test1.attr1)
print('test1_a.attr1 = ', test1_a.attr1)
print('test1_b.attr1 = ', test1_b.attr1)


'''测试二,不使用属性__slots__'''
class Test2(object):

def __init__(self):
pass

print('\nThis is Test2\n')

test2_a = Test2()
test2_a.attr1 = "I'm instance test2_a" #修改无影响
Test2.attr1 = "I'm class Test2"
print('test2_a.attr1 = ', test2_a.attr1)
print('Test2_attr1 =', Test2.attr1)

print('\n')
test2_b = Test2()
test2_b.attr1 = "I'm instance test2_b" #修改实例属性无影响
print('test_a.attr1 = ', test2_a.attr1)
print('test_b.attr1 = ', test2_b.attr1)
print('Test2.attr1 = ', Test2.attr1)

print('\n')
Test2.attr1 = "Hello World" #修改类影响
print('Test2.attr1 =', Test2.attr1)
print('test2_a.attr1 = ', test2_a.attr1)
print('test2_b.attr1 = ', test2_b.attr1)


总结:
1.解释一下,不用slots,类分配实例会开辟一块儿新的内存,所以他们各自只是一个引用,相互无影响,正如Test2测试结果一样。
2.使用slots后,python不使用字典数据结构分配空间,因为是节省了空间,所以之后动态生成的实例属性(在未绑定类属性之前,实例属性对其它实例的属性无影响【见注释(1)处】,当生成类属性后,并且属性名相同,实例的相同属性会同时指向类属型的内存位置,并且将内存标记为only-read,这时他们就都变成了一个类似引用的变量,如果修改的是内存,就不能用不可变的变量,如字符串,数字,本人用的是列表。但也只能是追加元素,因为内存已经分配好了),这就是slots的作用,节省空间。
3.当类属性分配,并且属性名与之前的实例属性一样,此时他们将同时指向一个位置,值也就发生了相应的改变。【见注释(2)处】
4.这时注释(3),与注释(4)也就好理解了,是因为它们指向了同一块儿内存,修改的是内存,所以这就会产生,修改实例属性,会对其他实例的属性,以及类属型进行修改,因为他们访问的是同一块儿内存。
这也就是slots会节省内存的原因 阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: