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('\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会节省内存的原因 阅读更多
#!/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会节省内存的原因 阅读更多
相关文章推荐
- python中__slots__用法实例
- Python深入06――python的内存管理详解
- C、python 、java内存管理区别
- Python属性、方法和类管理系列之----__slots__属性
- 7 python 动态绑定,@property的使用__slots_限制class的属性以及多重继承
- python 试题:简述Python是如何进行内存管理的?
- Python中使用__slots__注意项
- python中的__slots__
- Python内存管理及释放
- Python内存管理(二 arena和缓存池)
- Python __slots__
- python 内存管理
- Python的内存管理机制
- Python变量访问权限控制的几种方法:单下划线、双下划线、__slots__、@property、__all__
- C/C++/Java/C#/Python的内存管理机制整理
- python入门笔记(Day7)--slots,@property,MixIn,定制(str,iter,getitem,getattr,call)枚举(Enum)元type,metaclass,ORM
- 初学Python的学习笔记9----面向对象编程(获取对象信息、实例属性和类属性)、面向对象高级编程(使用__slots__、使用@property)
- python中__slots__用法实例
- python内存管理
- Python---__slots__