@2020.4.19
基础题(60分)
1.写代码是要避免循环导入,什么是循环导入?
循环导入是指 在一个模块导入的过程中,导入另一个模块,且在另一个模块中又返回来导入第一个模块的名字,这种情况下会加载模块失败,抛出异常。
2.模块的搜索顺序
内存中已加载的模块------》内置的模块——》sys.path路径中的模块
3.以下代码什么时候使用
```python
if __name__ == "__main__":
print("test")
```
在主程序中用来控制 .py文件在不同的应用场景下,执行不同的逻辑处理。
4.什么是面向过程编程思想?
面向过程编程思想,核心是“过程”二字,即 解决问题的过程步骤,先干什么后干什么。
5.有如下变量 请使用hashlib 为其加密 并 加盐
import hashlib
# 256
hash = hashlib.sha256('898oaFs09f'.encode('utf8'))
hash.update('ccat'.encode('utf8'))
print(hash.hexdigest())
6.判断一个对象是否属于str类型,判断一个类是否是另外一个类的子类?
c = '1345'
print(isinstance(c,str))
print(issubclass(str,object))
# 输出结果:
True
True
7.定义一个老师类,定制打印对象的格式为‘<name:C_DSB age:18 sex:male>’
class Teacher:
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
def __str__(self):
return '<name: %s age:%s sex:%s >' % (self.name, self.age, self.sex)
tea = Teacher('MILI', 27, 'male')
print(tea)
8.定义一个自己的open类,控制文件的读或写,在对象被删除时自动回收系统资源
class MYopen:
def __init__(self, file, io, encoding):
self.file = file
self.io = io
self.encoding = encoding
self.my_open = open(self.file, self.io, self.encoding)
def __del__(self):
self.my_open.close()
print("close the file")
my_open1 = MYopen(r'D:DOCUMENTSDUCUCourseSystemconfsettings.py', 'rt', 'utf-8')
del my_open1
9.什么是反射?反射的4个方法分别是什么?分别的作用是什么?
(1)反射是指 在程序运行的状态中,对于任意一个类,都可以知道这个类的所有方法和属性;对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取程序信息和动态调用对象的功能就是反射机制。
(2)反射的四个方法:
hasattr:判断对象是否有某种属性
getattr :获取对象的某种属性,若无则返回None
setattr :为对象赋值
delattr:删除对象的某个属性
10.property的作用是什么,简述内部实现原理
property装饰器,可以将类中的函数伪装成对象的数据属性,对象在访问这个特殊的属性时,会触发该功能,执行并返回执行结果。
11.__str__的作用是什么?
__str__是内置方法,打印返回字符串格式的返回值
12.学生类与,教师类同时拥有,姓名,性别,年龄三个属性,老师类比学生类多一个工资属性,请编写代码以减少重复代码!
class People:
def __init__(self,name,sex,age):
self.name = name
self.sex = sex
self.age = age
class Student(People):
def __init__(self):
print('<name: %s sex:%s age:%s >' % (self.name, self.sex, self.age))
class Teacher(People):
def __init__(self,salary):
self.__getattribute__(People)
self.salary = salary
13.封装就等于隐藏这种说法是否正确,为什么?
不正确。封装不是单纯的隐藏
封装的目的是区分内外,封装后的属性可以直接在类的内部使用,但是不能在外部使用,若需要使用,则要定义接口,让外部通过接口来访问封装的属性。
14.类中的 __getattr__ 方法什么时候被执行?
__getattr__ 方法只有在使用“点调用属性且属性不存在时,才会被触发
15.什么是抽象类?
抽象类是一种特殊的类,特殊之处在于它只能被继承,不能被实例化
16.OSI七层网路协议分别是哪些 ?
应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
17.以太协议,IP协议,TCP/UDP协议,分别工作在哪些层
以太协议——数据链路层
IP协议——网络层
TCP/UDP协议——传输层
18.端口号用于标识什么?
端口用于表示应用程序的入口
19.简述三次握手与四次挥手的经历
(1)三次握手——建立连接协议
=第一次握手:客户端发送syn包(syn= x)的数据包到服务器,并进入SYN_SEND状态,等待服务器确认
=第二次握手:服务器收到客户端发来的syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(syn= y)即SYN+ACK包,接着服务器进入SYN_RECV状态
=第三次握手:客户端收到服务器发来的SYN+ACK包,接着向服务器发送确认包ACK(ack=y+1),以表示确认自己收到了SYN+ACK包;发送确认包ACK(ack=y+1)完毕后,客户端和服务器端都进入了ESTABLISHED状态,此时三次握手就完成了。
(2)四次挥手
=第一次挥手:客户端程序运行到close()指令,处于FIN_WAIT_1的状态,向服务器端发送FIN(seq=x+2)+ACK(ack=y+1)包,等待服务器的回应
=第二次挥手:服务器接送到客户端发来的FIN+ACK包,向客户端发送
ACK(ack=x+3),此时服务器进入CLOSE_WAIT状态,客户端接收到服务器发送的ACK(ack=x+3)包,进入FIN_WAIT_2的状态
=三次挥手:服务器向客户端发送ACK(ack=x+3)后,接着进入LAST_ACK状态,并向客户端发送FIN(seq=y+1)包,确认close()命令的执行。
=第四次挥手:客户端接收到FIN(seq=y+1)包,进入TIME_WAIT状态,向服务器发送ACK(ack=y+2)包。此时四次挥手完成。
20.什么是面向对象编程思想?
面向对象编程思想的核心是“对象”,即将对象的数据和功能进行整合。
21.什么是面向对象三大特性?分别的作用是什么?
(1)封装:将对象的属性进行封装,明确区分内外,并提供接口供外部间接访问内部的属性。
(2)继承:最大限度地重用代码,减少代码的冗余,增强代码的可扩展性
(3)多态:增加代码的功能,可扩展性
22.__getattr__在什么时候触发?
__getattr__ 方法只有在使用“点调用属性且属性不存在时,才会被触发
23.__getattrubite__在什么时候触发?
__getattrubite__ 在使用“点调用属性时,不管属性是否存在,都会被触发执行
24.__call__在什么时候触发?
在有对象后面加上括号()时触发的。
25.什么是元类?
元类不是父类,是用来实例化产生类的类
26.如何用元类控制类的创建,请写代码?
class Mymeta(type):
def __init__(self,x,y,z):
print("run520")
print(self)
def __new__(cls, *args, **kwargs):
print('run1314')
return type.__new__(cls,*args,**kwargs)
People = Mymeta("People",(object,),{...})
class People(metaclass=Mymeta)
def __init__(self,name,age):
self.name = name
self.age = age
def say(self):
print('%s;%s'%(self.name,self.age))
27.对象的绑定方法、类的绑定方法与静态方法的区别是什么?
对象的绑定方法——是绑定到对象的方法,正常定义的函数默认是绑定到对象的
类的绑定方法——加上装饰器@classmethod,就是函数就绑定到类了
静态方法——加上装饰器@staticmethod,就是非绑定方法,即静态函数
28.对象的属性查找顺序是什么?
有继承关系后,对象在查找属性时,先从对象自己的__dict__中找,如果没有,则去子类中找,然后再去父类中找。
29. 什么是新式类?什么是经典类?
(1)在pyhton2中,有经典类和新式类之分。
没有显式继承object类的类以及其子类,都是经典类
显式继承object类的类以及其子类,都是新式类
(2)在python3 中,即使没有显式继承object类,也会默认继承该类。所以python3 中都是新式类
30.Python面向对象中的多继承的继承关系如何查找?
(1)如果多继承是非菱形继承,经典类和新式类的属性查找顺序一样,都是一个分支一个分支地找下去,最后再找object类
(2)如果多继承是菱形继承,经典类与新式类的属性查找不一样。
经典类:深度优先,会在检索的时候,一条路走到底一直到父类
新式类:广度优先,会在检索时,最后一个分支的时候检索父类