@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

 

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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:\DOCUMENTS\DUCU\CourseSystem\conf\settings.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)如果多继承是菱形继承,经典类与新式类的属性查找不一样。

经典类:深度优先,会在检索的时候,一条路走到底一直到父类

新式类:广度优先,会在检索时,最后一个分支的时候检索父类

 

 

 

 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄