OOP常见概念梳理
在一个软件设计与开发中,所有包名、类名、函数名、变量名都应该遵循一定的开发规范
- 如无特殊情况, 文件一律使用 UTF-8 编码
- 代码避免采用空格缩进,统一使用Tab进行缩进
- 块级函数和类定义之间空二行,类成员与函数之间空一行
- 模块尽量使用小写命名,首字母保持小写,如果有多个单词采用下划线分割
- 类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头
- 函数名一律小写,如有多个单词,用下划线隔开
- 变量名尽量小写, 如有多个单词,用下划线隔开
自定义和调用函数时,可使用的正式参数类型有四种
- 必需参数:必须以正确的顺序传入函数。调用时的数量必须和声明时的一样否则会报错
- 默认参数:调用函数时,如果没有传递参数,则会使用默认参数,默认参数间接实现Python多态性
- 不定长参数:加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数
- 关键字参数:使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值
Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的
- Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域
- if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问
- 当内部作用域想修改外部作用域的变量时,就要用到global关键字了。
Py中装饰器语法复习
- 一切皆为对象,函数也是一个对象,而函数名称就是对象名称
- 可以在函数中定义和返回另一个函数
- 使用 @ 符号引用已有的函数(比如 @classmethod)后,可用于修饰其他函数,装饰被修饰的函数
- 装饰器在日志、权限、函数执行时间等场景中使用比较多
模块是一个包含所有你定义的类、函数、变量的文件,py为后缀。模块可以被别的程序引入,以使用该模块中的对象
- 一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行,第一次被执行时被导入模块会生成pyc格式的文件
- Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中
- 每个模块都有一个__name__属性,当其值是’main’时,表明该模块自身在运行,否则是被引入
- 如果包定义文件 init.py 存在一个叫做 all 的列表变量,那么在使用 from package import * 的时候就把这个列表中的所有名字作为包内容导入
- 搜索路径是在Python编译或安装的时候确定的,安装新的库应该也会修改。搜索路径被存储在sys模块中的path变量
Python OOP相关概念
- 两个下划线开头,声明该属性或者方法为私有,不能在类的外部被使用或直接访问
- init : 构造函数,在生成对象时调用,del : 析构函数,释放对象时使用
- 多态性分为重写与重载,子类可以重写父类声明的方法而方法中可变参数与关键字参数是Py多态性表现形式
Py面向对象浅谈
- 面向对象是相对于面向过程而言的
- 面向过程语言是一种基于功能分析的、以算法为中心的程序设计方法;而面向对象是一种基于结构分析的、以数据为中心的程序设计思想
- 在面向对象语言中有一个有很重要东西,叫做类,类是所有对象的模板
- 面向对象程序设计的一个关键性观念是将数据和数据的操作封装在一起,组成一个相互依存,不可分割的整体
Http请求中get与post的区别
- 最直接的区别,GET请求的参数是放在URL里的,POST请求参数是放在请求body里的
- GET请求的URL传参有长度限制,而POST请求没有长度限制
- GET请求的参数只能是ASCII码,所以中文需要URL编码,Post请求没有此限制,因此可以传输多媒体数据
- Get比Post要更加省资源
Py中函数与方法的区别
- 方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将会被作为第一个参数传入 (系统自带)
- 普通函数没有self概念,普通的函数定义在模块中,而方法定义在类中
- 方法通常操作自身对象的属性(例如对当前属性列表进行排序),而函数在进行操作时通常指明排序对象 (例如系统内置函数sorted函数)
- 因为方式是定义在类中,因此方法定义肯定有缩进。而函数定义在模块中,因此它在定义时并不会缩进
你需要了解的self关键字
- self在对象的方法中表示当前对象本身,如果通过对象调用一个方法,那么该对象会自动传入到当前方法 的第一个参数中
- self并不是关键字,只是一个用于接受对象的普通参数,理论上可以用任何一个普通变量名代替
- 方法中有self形参的方法成为非绑定类的方法,可以通过对象访问, 没有self的是绑定类的方法, 只能通过类访问
- 使用类访问绑定类的方法时, 如果类方法中需要访问当前类的成员,可以通过 class成员名来访问
OOP经典选择题
各位童鞋,为了方便大家学习,括号中的答案字体颜色设置成了白色,用鼠标选中括号即可显示答案 o( ̄︶ ̄)o
Python如何定义一个函数 ( C )
A. class ( arg1, arg2,… argN)
B. function (arg1,arg2,…argN)
C. def (arg1,arg2,…argN)
D. def (type arg1,type arg2,…type argN)
关于函数的下列说法不正确的是 ( D )
A. 函数可以没有参数
B. 函数可以没有return语句
C. 函数由系统函数和自定义函数
D. 函数必须要有返回值
关于Python的Lambda函数,以下选项中描述错误的是 ( B )
A. Lambda函数将函数名作为函数结果返回
B. f = Lambda x,y:x+y 执行后,f的类型为数字类型
C. Lambda用于定义简单的、能够在一行内表示的函数
D. 可以使用Lambda函数定义列表的排序原则
以下选项中说法不正确的是 ( D )
A. 解释是将源代码逐条转换成目标代码同时逐条运行目标代码的过程
B. 编译是将源代码转换成目标代码的过程
C. C语言是静态语言,Python语言是脚本语言
D. 静态语言采用解释方式执行,脚本语言采用编译方式执行
以下选项中,不是 Python 语言保留字的是 ( A )
A. do
B. pass
C. except
D. while
以下选项中,不属于函数的作用的是 ( A )
A. 提高代码执行速度
B. 降低编程复杂度
C. 增强代码可读性
D. 复用代码
在Python中,关于全局变量和局部变量,以下选项中描述不正确的是 ( B )
A. 一个程序中的变量包含两类:全局变量和局部变量
B. 全局变量不能和局部变量重名
C. 全局变量一般没有缩进
D. 全局变量在程序执行的全过程有效
关于函数的参数,以下选项中描述错误的是 ( A )
A. 可选参数可以定义在非可选参数的前面
B. 一个元组可以传递给带有星号的可变参数
C. 在定义函数时,可以设计可变数量参数,通过在参数前增加星号(*)实现
D. 在定义函数时,如果有些参数存在默认值,可以在定义函数时直接为这些参数指定默认值
以下内容关于函数描述正确的是 ( C )
A. 函数用于创建对象
B. 函数可以让重新执行的更快
C. 函数是一段代码用于执行特定的任务
D. 以上说法都是正确的
关于 Python 程序格式框架的描述,以下选项中错误的是 ( A )
A. Python 语言不采用严格的“缩进”来表明程序的格式框架
B. Python 单层缩进代码属于之前最邻近的一行非缩进代码,多层缩进代码根据缩进关系决定所属范围
C. Python 语言的缩进可以采用 Tab 键实现
D. 判断、循环、函数等语法形式能够通过缩进包含一批 Python 代码,进而表达对应的语义
OOP简答题
Python 内建数据类型有哪些
- 整型 int
- 布尔型 bool
- 字符串 str
- 列表 list
- 元组 tuple
- 字典 dict
Python中 help()和 dir()函数的用途是什么
- dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表
- 带参数时,返回参数的属性、方法列表
- help()函数用于显示文档字符串,还可以帮助您查看与模块,关键字,属性等相关的帮助
Python 中 is、==、isinstance()的区别
- is 判断的是 a 对象是否就是 b 对象,是通过 id 来判断的
- ==判断的是 a 对象的值是否和 b 对象的值相等,是通过 value 来判断的
- 还可以使用内置函数isinstance()来测试一个对象是否属于某个类的实例
简单列举说明私有成员、保护成员、特殊成员的特性
- _xxx 一个下划线开头,保护成员,只有该类的对象和子对象可以访问这些成员
- __xxx__ 系统定义的特殊成员 (特殊属性 + 特殊方法)
- xxx 私有成员,一般只有类对象自己能访问,子类对象也不能访问该成员,但是外部对象可以通过 "对象名_类名__xxx"这样特殊方式来访问
Python 中的模块和包是什么
- 在Python中,模块是搭建程序的一种方式。每一个Python代码文件都是一个模块,并可以引用其他的模块中定义的函数、类信息
- 一个包含许多Python代码的文件夹是一个包。一个包可以包含模块和子包,所有的Py包都有__init__py 文件
介绍一下Py中 except 的用法和作用
- try…except…except…else…finally…
- 执行 try 下的语句,如果引发异常,则执行过程会跳到 except 语句
- try 下的语句正常执行,则执行 else 块代码。如果发生异常,就不会执行
- 如果存在 finally 语句,最后总是会执行
Python中重载的实现机制
一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其实不同,那么不应当使用重载,而应当使用一个名字不同的函数
- 可变参数类型
- 可变参数个数
Python里面如何生成随机数?
- 随机整数:random.randint(a,b) 返回随机整数x,a<=x<=b
- 随机实数:random.random( ) 返回0到1之间的浮点数
- random.uniform(a,b):返回指定范围内的浮点数
Python的可变类型与不可变类型
- Python的每个对象都分为可变和不可变,主要的核心类型中,数字、字符串、元组是不可变的,列表、字典是可变的,对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象
- 对于不可变类型int,无论创建多少个不可变类型,只要值相同 【-5~256】区间,都指向同个内存地址,其它的同理
Python的参数传递是值传递还是引用传递
不可变参数用值传递像整数和字符串这样的不可变对象,是通过拷贝进行传递的,因为你无论如何都不可能在原处改变不可变对象,可变参数是用引用传递的