网站验证码目录,简单带数据库的网站模版,服务器网站搬家,百度seo公司引言 在前面介绍Python容器的时候#xff0c;我们曾经用过这种夸张的表述#xff0c;“Python就是包裹在一堆语法糖中的字典”。虽然夸张#xff0c;其实更多的是为了突出Python中dict的强大之处。今天这篇文章#xff0c;打算看下Python中类对象、实例对象的表示及内存管理…引言 在前面介绍Python容器的时候我们曾经用过这种夸张的表述“Python就是包裹在一堆语法糖中的字典”。虽然夸张其实更多的是为了突出Python中dict的强大之处。今天这篇文章打算看下Python中类对象、实例对象的表示及内存管理又会涉及到dict。 实例对象的__dict__属性 先说结论从内部实现的角度来看实例是使用字典dict来实现的。
前面介绍私有化属性时已经简单用到过__dict__这个属性可以通过实例的__dict__ 属性访问实例底层的字典。这个字典包含的数据对每个实例而言都是唯一的。可以在任何时候向实例添加新属性。也是通过__dict__。
对实例的修改始终会反映到局部__dict__ 属性中。同样如果直接对__dict__ 进行修改所做的修改也会反映在实例的属性中。
通过代码来验证这个结论
class DaGongRen:def __init__(self, name, age, salary):self.name nameself.age ageself.__salary salarydef get_salary(self):return self.__salaryif __name__ __main__:dgr DaGongRen(张三, 18, 100)# 从__dict__中可以看到实例所有的属性包括混淆名称后的私有属性print(dgr.__dict__)# 通过obj.attr的方式修改属性dgr.age 20# 再次查看__dict__age对应的value同步变更print(dgr.__dict__)# 通过__dict__直接修改value值dgr.__dict__[name] 李四# 实例的属性同步发生变更print(dgr.name)# 私有属性也一样dgr.__dict__[_DaGongRen__salary] 9999print(dgr.get_salary())执行结果 类对象的__dict__属性
其实类本身也只是对字典的浅层包装我们可以在实例的__dict__ 属性中找到这个字典。
直接看代码
from rich.pretty import pprintclass DaGongRen:这里是说明文档会存储在__doc__属性中cnt 0def __init__(self, name, age, salary):self.name nameself.age ageself.__salary salaryself.__class__.cnt 1def get_salary(self):return self.__salaryclassmethoddef test_class_method(cls):print(cls)staticmethoddef test_static_method():print(test)if __name__ __main__:# 查看类对象的__dict__pprint(DaGongRen.__dict__)dgr DaGongRen(张三, 18, 100)# 通过类对象的__dict__调用get_salary()方法由于是通过类对象调用第一个参数self需要手动传递print(DaGongRen.__dict__[get_salary](dgr))# 调用类方法DaGongRen.__dict__[test_class_method].__func__(DaGongRen)# 调用静态方法DaGongRen.__dict__[test_static_method].__func__()执行结果 从执行结果中可以看出类对象也是有__dict__属性的存储的是在类中定义的实例方法、类方法和静态方法以及类属性等。 总结 通过对比实例对象的__dict__和类对象的__dict__相关代码的示例可以得出如下结论
1、对象底层是对dict做了一层弱封装不管是实例对象还是类对象。
2、类中定义的类属性属于类存储在类对象的__dict__属性对应的字典中类的__init__初始化方法或者实例对象中动态添加的属性属于实例对象存储在实例对象的__dict__属性对应的字典中。
3、类中定义的方法不管是实例方法、类方法还是静态方法都属于类统一存储在类对象的__dict__属性对应的字典中。
4、实例方法其实就是普通的函数对象类方法和静态方法分别对函数对象做了一层对应的封装。
通过这篇文章我们应该能够对类、实例的存储有了更进一步的理解。
但是还有一个问题。既然Python中一切皆对象对象底层又是对dict的封装那么问题来了为什么有些内置类型的对象没有__dict__属性或者无法在__dict__属性中找到类中定义的实例属性
这个问题涉及到对象内存的管理与优化我们放到下一篇文章中来回答。
感谢您的拨冗阅读如果对您学习Python有所帮助欢迎点赞、收藏。