在Python中,一切目标都共有一些特性,这些特性界说在PyObject中。PyObject界说在Include/objecth中:#definePyObject_HEAD\
简化后即为:typedefstruct_object{
在PyObject中,ob_refcnt用以记载目标的引证数(与引证计数的内存收回有关,这儿暂且不表),当有新的指针指向某目标时,ob_refcnt的值加1,当指向某目标的指针删去时,ob_refcnt的值减1,当其值为零的时分,则能够将该目标从堆中删去(事实上并不会当即删去,这儿暂且不表)。除了ob_refcnt之外,还有一个指向_typeobject指针ob_type。这个构造体用于表明目标类型。越过_typeobject,能够发现,Python目标的中心在于一个引证计数和一个类型信息。
PyObject界说的内容会出如今每个目标所占内存的开端有些。
定长目标与变长目标
在Python中,除了boolfloat这么的定长目标(一旦断定下来需求的内存,便不再有改动),还有另外一种目标:长度可变的目标。这种目标在Python的完成中经过PyVarObject构造体来表明:#definePyObject_VAR_HEAD\
事实上,即是在PyObject的基础上,多了一个ob_size变量,用以标识目标的长度(是长度,不是内存占用)。也即是说,本来PyVarObject即是PyObject的一个拓宽,所以,在Python中,一切的目标都能够经过PyObject指针来引证,这一点非常重要,它使得许多 *** 作变得一致(这篇博客暂不胪陈)。
由此,Python中一切目标在完成的时分,内存无非如下两种状况:定长目标变长目标
道生一:PyTypeObject
在描绘PyObject的时分,提到了一个_typeobject构造体。那么,它是干什么的呢?幻想一下,一个目标在创立的时分需求多少内存、这个目标的类名是什么等等信息,又是怎么记载和区别的呢?
_typeobject(也即是PyTypeObject)能够被称之为“指定目标类型的类型目标”,其界说如下:typedefstruct_typeobject{
能够理解为,PyTypeObject目标是Python中面向目标理念中“类”这个概念的完成,这儿仅仅简略介绍其界说中的有些内容:
ty_name:类型名tp_basicsize,tp_itemsize:创立类型目标时分配的内存大小信息被省掉掉的有些:与该类型相关的 *** 作(函数指针)
这儿仅仅简略描绘,上面的内容有些偏颇,暂不用过分深究。
再看一眼PyTypeObject的界说,能够发如今最开端也有一个PyObject_VAR_HEAD,这意味着它也是一个目标。那么,PyTypeObject既然是指示类型的目标,那么它的类型又是什么呢?答案是PyType_Type:PyTypeObjectPyType_Type={
事实上,它即是Python语言中的type目标即是PyType_Type,它是一切class的class,在Python中叫做metaclass。本来,在完成中它的ob_type指针又指向了自己自身,既是:PyType_Type
Python解释器
Python文本编辑器
Python代码运行助手
输入和输出
Python基础
数据类型和变量
字符串和编码
使用list和tuple
条件判断
循环
使用dict和set
函数
调用函数
定义函数
函数的参数
递归函数
高级特性
切片
迭代
列表生成式
生成器
迭代器
函数式编程
高阶函数
map/reduce
filter
sorted
返回函数
匿名函数
装饰器
偏函数
模块
使用模块
安装第三方模块
面向对象编程
类和实例
访问限制
继承和多态
获取对象信息
实例属性和类属性
面向对象高级编程
使用__slots__
使用@property
多重继承
定制类
使用枚举类
使用元类
错误、调试和测试
错误处理
调试
单元测试
文档测试
IO编程
文件读写
StringIO和BytesIO
*** 作文件和目录
序列化
进程和线程
多进程
多线程
ThreadLocal
进程 vs 线程
分布式进程
正则表达式
常用内建模块
datetime
collections
base64
struct
hashlib
hmac
itertools
contextlib
urllib
XML
HTMLParser
常用第三方模块
Pillow
requests
chardet
psutil
virtualenv
图形界面
网络编程
TCP/IP简介
TCP编程
UDP编程
电子邮件
SMTP发送邮件
POP3收取邮件
访问数据库
使用SQLite
使用MySQL
使用SQLAlchemy
Web开发
>
看返回。python里区分get和getall看返回,getall返回的是QuerySet,get返回的是模型对象,从QuerySet中获取对象可通过forin的形式遍历,之后通过对象获取对象的具体值,get返回的是对象,直接调用访问对象成员即可。
Python赋值 *** 作或函数参数传递,传递的永远是对象引用(即内存地址),而不是对象内容。在Python中一切皆对象,对象又分为可变(mutable)和不可变(immutable)两种类型。对象拷贝是指在内存中创建新的对象,产生新的内存地址。当顶层对象和它的子元素对象全都是immutable不可变对象时,不存在被拷贝,因为没有产生新对象。浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象。深拷贝(Deep Copy),递归拷贝顶层对象,以及它内部的子元素对象。
Python中一切皆对象,对象就像一个塑料盒子, 里面装的是数据。对象有不同类型,例如布尔型和整型,类型决定了可以对它进行的 *** 作。现实生活中的"陶器"会暗含一些信息(例如它可能很重且易碎,注意不要掉到地上)。
对象的类型还决定了它装着的数据是允许被修改的变量(可变的mutable)还是不可被修改的常量(不可变的immutable)。你可以把不可变对象想象成一个透明但封闭的盒子:你可以看到里面装的数据,但是无法改变它。类似地,可变对象就像一个开着口的盒子,你不仅可以看到里面的数据,还可以拿出来修改它,但你无法改变这个盒子本身,即你无法改变对象的类型。
对象拷贝是指在内存中创建新的对象,产生新的内存地址。
浅拷贝(Shallow Copy),拷贝顶层对象,但不会拷贝内部的子元素对象。
211 顶层是mutable,子元素全是immutable
当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时,如[1, 'world', 2]
① 创建列表对象并赋值给变量a
② 导入copy模块,使用copycopy()函数浅拷贝a,并赋值给变量b
③ 修改变量a的子元素a[0] = 3,由于整数是不可变对象,所以并不是修改1变为3,而是更改a[0]指向对象3
当顶层对象是 mutable可变对象 ,但子元素也存在 mutable可变对象 时,如 [1, 2, ['hello','world']]
① 浅拷贝 copycopy() 只拷贝了顶层对象,没有拷贝子元素对象['hello','world'],即a[2]和b[2]指向同一个列表对象
② 修改a[2][1] = 'china',则b[2][1] = 'china'
当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1, 2, 3)
变量a与变量b指向的是同一个元组对象,没有拷贝
当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])
变量a与变量b指向的是相同的元组对象,并且a[2]与b[2]指向同一个列表,所以修改a[2][1]会影响b[2][1]
深拷贝(Deep Copy),递归拷贝顶层对象,以及它内部的子元素对象
当顶层对象是mutable可变对象,但是它的子元素对象全都是immutable不可变对象时,如[1, 'world', 2]
变量a与变量b指向不同的列表对象,修改a[0]只是将列表a的第一个元素重新指向新对象,不会影响b[0]
当顶层对象是mutable可变对象,但子元素也存在mutable可变对象时,如[1, 2, ['hello','world']]
深拷贝既拷贝了顶层对象,又递归拷贝了子元素对象,所以a[2]与b[2]指向了两个不同的列表对象(但是列表对象的子元素初始指定的字符串对象一样),修改a[2][1] = 'china'后,它重新指向了新的字符串对象(内存地址为140531581905808),不会影响到b[2][1]
当顶层对象是immutable不可变对象,同时它的子元素对象也全都是immutable不可变对象时,如(1, 2, 3)
变量a与变量b指向的是同一个元组对象,不存在拷贝
当顶层对象是immutable不可变对象时,但子元素存在mutable可变对象时,如(1, 2, ['hello','world'])
变量a与变量b指向的是不同的元组对象,同时a[2]与b[2]指向不同的列表对象,所以修改a[2][1]不会影响b[2][1]
使用=是赋值,即将列表对象的引用也赋值给变量b,可以将列表对象想像成一个盒子,变量a相当于这个盒子上的标签,执行b = a后,相当于再在这个盒子上贴上b标签,a和b实际上指向的是同一个对象。因此,无论我们是通过a还是通过b来修改列表的内容,其结果都会作用于双方。
b/c/d都是a的复制,它们都指向了不同的列表对象,但是没有拷贝子元素,a[2]和b[2]/c[2]/d[2]指向同一个列表, 相当于浅拷贝的效果
使用分片[:] *** 作,a和b其实是指向同一个元组,而且没有拷贝子元素,a[2]和b[2]也指向同一个列表,相当于浅拷贝的效果
同列表类似,可以使用字典的copy()函数或者转换函数dict()
变量a与变量b/c指向不同的字典,但是没有拷贝子元素,a['jobs']和b['jobs']/c['jobs']指定同一个列表, 相当于浅拷贝的效果
同列表类似,可以使用集合的copy()函数或者转换函数set()
变量a与变量b/c指向不同的集合,而集合的元素必须是hashable,所以修改集合a不会影响到b/c
用法:
1导入render_template函数
2当你创建完成flask项目后,会自动生成static文件夹用来放css,js文件,templates文件夹放html文件。在templates文件夹下新建indexhtml文件
3在apppy中渲染html,templates文件夹是自动生成的,当使用render_template渲染html时,它会自动去templates文件夹下找,所以这里不用谢文件夹名字,直接写html的名字就可以。
效果图
在网页中用户登录后,显示用名字,就是后台向前端界面传递用户的信息,前端接收到后显示出来。
用法:在渲染模板时将参数写在后面
在html文件中获取参数,读取值使用{{参数名}}
当传递参数较多时,将它们放在字典中,然后使用字典名进行传递
读取方法还相同
补充:如果字典中有对象,要在html中获取对象的属性值,{{对象名属性}},如果字典中还有字典,同样获取值使用{{字典名属性}}
以上就是关于Python语言中的对象概述是怎样的全部的内容,包括:Python语言中的对象概述是怎样的、Python的基本术语有哪些、python里怎么区分get和getall等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)