python 面试常问309道

  • 第一部分 Python基础篇(80题)
  • 第二部分 网络编程和并发(34题)
  • 第三部分 数据库和缓存(46题)
  • 第四部分 前端、框架和其他(149题)


第一部分 Python基础篇(80题)

1、为什么学习Python?
2、通过什么途径学习的Python?
3、Python和Java、PHP、C、C#、C++等其他语言的对比?
答案:Python语言,是一种面向对象、直译式计算机程序设计语言,Python语法简洁而清晰,具有丰富和强大的类库。Java语言,是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。PHP语言,是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C#语言,C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。
4、简述解释型和编译型编程语言?
答案:解释型语言是指源代码不需要预先进行编译,在运行时,要先进行解释再运行。解释型语言执行效率低,但跨平台性好;如:java,pyhon。编译型语言是指程序在执行之前需要一个专门的编译过程,把程序源文件编译为机器语言的文件,运行时不需要重新编译,执行效率高,但缺点是,编译型语言依赖编译器,跨平台性差;如:C语言、C++。
5、Python解释器种类以及特点?
答案:CPython:c语言开发的 使用最广的解释器。
IPython:基于cpython之上的一个交互式计时器 交互方式增强 功能和cpython一样。
PyPy:目标是执行效率 采用JIT技术 对python代码进行动态编译,提高执行效率。
JPython:运行在Java上的解释器 直接把python代码编译成Java字节码执行。
IronPython:运行在微软 .NET 平台上的解释器,把python编译成. NET 的字节码。
6、位和字节的关系?
答案:位(bit):一个二进制数据0或1,是计算机传输的最小单元,8位组成一个字节。字节(byte):存储空间的计量单元,1个字节有8个bit。
7、b、B、KB、MB、GB 的关系?
答案:1GB(吉比特) = 1024MB(兆比特),1MB = 1024KB(千比特),1 KB = 1024B(字节),1B = 8b (比特 位)
8、请至少列举5个 PEP8 规范(越多越好)。
答案:(1)每级缩进使用 4 个空格。(2)限制所有行的最大长度为 79 个字符。(3)顶层函数和类之间使用两个空行;类的方法之间使用一个空行。(4)导入通常应当使用单独的行,例如:import os ,import sys 避免 import sys, os。(5)在算术运算符前后加空格
9、通过代码实现如下转换:
二进制转换成十进制:v = “0b1111011”
十进制转换成二进制:v = 18
八进制转换成十进制:v = “011”
十进制转换成八进制:v = 30
十六进制转换成十进制:v = “0x12”
十进制转换成十六进制:v = 87

答案:

v = b'0b1111011' #二进制转换成十进制
print(int(v,2))
v = 18           #十进制转换成二进制
print(bin(v))
v = '011'        #八进制转换成十进制
print(int(v,8))
v = 30           #十进制转换成八进制
print(oct(v))
v = '0x12'       #十六进制转换成十进制
print(int(v.upper(),16))
v = 87           #十进制转换成十六进制
print(hex(v))
print(str(int(hex(20).upper(),16))) #十进制转换成十六进制再转换成十进制

10、请编写一个函数实现将IP地址转换成一个整数。
如 10.3.9.12 转换规则为:
10 00001010
3 00000011
9 00001001
12 00001100
再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ?
答案:167971084

class Switch(object):

    def __init__(self, ip_str):
        self.ip_str = ip_str

    def ten_switch_two(self, num):
        demo = list()
        while num > 0:
            ret = num % 2
            demo.append(str(ret))
            num = num // 2
        temp = "".join((list(reversed(demo))))
        head_zero = "0"*(8-len(temp))
        ret = head_zero + temp
        return ret

    def two_switch_ten(self, num):
        # 字符串转列表
        num_list = list()
        for i in num:
            num_list.append(i)
        temp = 0
        s = len(num_list) - 1
        for i in num_list:
            temp += int(i) * 2 ** s
            s -= 1
        return temp

    def run(self):
        # 1.切割字符串
        part_list = self.ip_str.split(".")
        # 2.循环取出每个数字转成二进制数
        temp_str = ""
        for ip_part in part_list:
            temp_str += self.ten_switch_two(int(ip_part))
        ret = self.two_switch_ten(temp_str)
        print(ret)

obj = Switch('10.3.9.12')
obj.run()

11、python递归的最大层数?
答案:Python的最大递归层数是可以设置的,默认的在window上的最大递归层数是998。
12、求结果:
v1 = 1 or 3
v2 = 1 and 3
v3 = 0 and 2 and 1
v4 = 0 and 2 or 1
v5 = 0 and 2 or 1 or 4
v6 = 0 or False and 1
答案:1,3,0,1,1,False
13、ascii、unicode、utf-8、gbk 区别?
14、字节码和机器码的区别?
15、三元运算规则以及应用场景?
16、列举 Python2和Python3的区别?
17、用一行代码实现数值交换:

a = 1
b = 2
答案:a,b = b,a
18、Python3和Python2中 int 和 long的区别?
19、xrange和range的区别?

答案:在Python2中,xrange是一个生成器,而range是一个列表,但在Python3中已经没有了xrange,range是一个生成器。
20、文件操作时:xreadlines和readlines的区别?
21、列举布尔值为False的常见值?
22、字符串、列表、元组、字典每个常用的5个方法?
23、lambda表达式格式以及应用场景?
24、pass的作用?

答案:用来占位。例如:def xx():pass 。没有pass会显示错误
25、*arg和kwarg作用**
答案:arg传入的是一个元组,而**kwarg传入的是一个字典。
26、is和==的区别
27、简述Python的深浅拷贝以及应用场景?
28、Python垃圾回收机制?
29、Python的可变类型和不可变类型?
30、求结果:

v = dict.fromkeys([‘k1’,‘k2’],[])
v[‘k1’].append(666)
print(v)
v[‘k1’] = 777
print(v)
31、求结果:
def num():
return [lambda x:i
x for i in range(4)]
print([m(2) for m in num()])
32、列举常见的内置函数?
33、filter、map、reduce的作用?
34、一行代码实现9*9乘法表
35、如何安装第三方模块?以及用过哪些第三方模块?
36、至少列举8个常用模块都有那些?
37、re的match和search区别?
38、什么是正则的贪婪匹配?
39、求结果:

a. [ i % 2 for i in range(10) ]
b. ( i % 2 for i in range(10) )
40、求结果:
a. 1 or 2
b. 1 and 2
c. 1 < (2==2)
d. 1 < 2 == 2
41、def func(a,b=[]) 这种写法有什么坑?
42、如何实现 “1,2,3” 变成 [‘1’,’2’,’3’] ?
43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ?
44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别?
45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ?
46、一行代码实现删除列表中重复的值 ?
47、如何在函数中设置一个全局变量 ?

答案:使用global关键字
48、logging模块的作用?以及应用场景?
49、请用代码简答实现stack 。
50、常用字符串格式化哪几种?
51、简述 生成器、迭代器、可迭代对象 以及应用场景?
52、用Python实现一个二分查找的函数。
53、谈谈你对闭包的理解?
54、os和sys模块的作用?
55、如何生成一个随机数?
56、如何使用python删除一个文件?
57、谈谈你对面向对象的理解?
58、Python面向对象中的继承有什么特点?
59、面向对象深度优先和广度优先是什么?
60、面向对象中super的作用?
61、是否使用过functools中的函数?其作用是什么?
62、列举面向对象中带爽下划线的特殊方法,如:new、init
63、如何判断是函数还是方法?
64、静态方法和类方法区别?
65、列举面向对象中的特殊成员以及应用场景
66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数
67、什么是反射?以及应用场景?
68、metaclass作用?以及应用场景?
69、用尽量多的方法实现单例模式。
70、装饰器的写法以及应用场景。
71、异常处理写法以及如何主动跑出异常(应用场景)
72、什么是面向对象的mro
73、isinstance作用以及应用场景?
74、写代码并实现:

Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would
have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1]
75、json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型?
76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办?
77、什么是断言?应用场景?
78、有用过with statement吗?它的好处是什么?
79、使用代码实现查看列举目录下的所有文件。
80、简述 yield和yield from关键字。

第二部分 网络编程和并发(34题)

1、简述 OSI 七层协议。
2、什么是C/S和B/S架构?
3、简述 三次握手、四次挥手的流程。
4、什么是arp协议?
5、TCP和UDP的区别?
6、什么是局域网和广域网?
7、为何基于tcp协议的通信比基于udp协议的通信更可靠?
8、什么是socket?简述基于tcp协议的套接字通信流程。
9、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?
10、IO多路复用的作用?
11、什么是防火墙以及作用?
12、select、poll、epoll 模型的区别?
13、简述 进程、线程、协程的区别 以及应用场景?
14、GIL锁是什么鬼?
15、Python中如何使用线程池和进程池?
16、threading.local的作用?
17、进程之间如何进行通信?
18、什么是并发和并行?
19、进程锁和线程锁的作用?
20、解释什么是异步非阻塞?
21、路由器和交换机的区别?
22、什么是域名解析?
23、如何修改本地hosts文件?
24、生产者消费者模型应用场景及优势?
25、什么是cdn?
26、LVS是什么及作用?
27、Nginx是什么及作用?
28、keepalived是什么及作用?
29、haproxy是什么以及作用?
30、什么是负载均衡?
31、什么是rpc及应用场景?
32、简述 asynio模块的作用和应用场景。
33、简述 gevent模块的作用和应用场景。
34、twisted框架的使用和应用?

第三部分 数据库和缓存(46题)

1、列举常见的关系型数据库和非关系型都有那些?
2、MySQL常见数据库引擎及比较?
3、简述数据三大范式?
4、什么是事务?MySQL如何支持事务?
5、简述数据库设计中一对多和多对多的应用场景?
6、如何基于数据库实现商城商品计数器?
7、常见SQL(必备)
**

请创建如下表,并创建相关约束

一、表关系

python计算峰值突出度_python计算峰值突出度


二、操作表

1、自行创建测试数据
	班级与学生关系:一对多;老师与课程关系:一对多;学生与课程关系:多对多,中间表(成绩表)。
	2、查询“生物”课程比“物理”课程成绩高的所有学生的学号;
	
	3、查询平均成绩大于60分的同学的学号和平均成绩; 
	SELECT AVG(number) 平均成绩,student_id 学号 FROM score GROUP BY student_id HAVING 平均成绩>60
	4、查询所有同学的学号、姓名、选课数、总成绩;
	
	5、查询姓“李”的老师的个数;
	SELECT count(1) FROM teacher WHERE tname like '李%'
	6、查询没学过“叶平”老师课的同学的学号、姓名;
	
	7、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名;
	
	8、查询学过“叶平”老师所教的所有课的同学的学号、姓名;
	
	9、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名;
	
	10、查询有课程成绩小于60分的同学的学号、姓名;
	select student.sid,student.sname FROM student WHERE sid in(SELECT student_id FROM score WHERE number<60 GROUP BY student_id)
	11、查询没有学全所有课的同学的学号、姓名;
	SELECT student.sid,student.sname FROM student left join score on student.sid=score.student_id GROUP BY student.sid HAVING count(1)< (select count(*) FROM course)
	12、查询至少有一门课与学号为“001”的同学所学相同的同学的学号和姓名;
	
	13、查询至少学过学号为“001”同学所选课程中任意一门课的其他同学学号和姓名;
	
	14、查询和“002”号的同学学习的课程完全相同的其他同学学号和姓名;
	
	15、删除学习“叶平”老师课的SC表记录;
	
	16、向SC表中插入一些记录,这些记录要求符合以下条件:①没有上过编号“002”课程的同学学号;②插入“002”号课程的平均成绩; 
	
	17、按平均成绩从低到高显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分;
	
	18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分;
	
	19、按各科平均成绩从低到高和及格率的百分数从高到低顺序;
	
	20、课程平均分从高到低显示(现实任课老师);
	
	21、查询各科成绩前三名的记录:(不考虑成绩并列情况) 
	
	22、查询每门课程被选修的学生数;
	
	23、查询出只选修了一门课程的全部学生的学号和姓名;
	select * FROM student where sid in(SELECT student_id FROM score GROUP BY student_id HAVING count(student_id)=1)
	24、查询男生、女生的人数;
	SELECT count(gender),gender FROM student GROUP BY gender
	25、查询姓“张”的学生名单;
	SELECT * FROM student WHERE sname like '张%'
	26、查询同名同姓学生名单,并统计同名人数;
	select count(sname),sname FROM student GROUP BY sname
	27、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列;
	
	28、查询平均成绩大于85的所有学生的学号、姓名和平均成绩;
	
	29、查询课程名称为“数学”,且分数低于60的学生姓名和分数;
	select sname,number FROM student RIGHT join (SELECT * FROM score left join course on score.corse_id=course.cid WHERE course.cname='数学' and score.number<60) n on student.sid=n.student_id
	30、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名; 
	
	31、求选了课程的学生人数
	SELECT count(DISTINCT student_id) FROM score
	32、查询选修“杨艳”老师所授课程的学生中,成绩最高的学生姓名及其成绩;
	
	33、查询各个课程及相应的选修人数;
	
	34、查询不同课程但成绩相同的学生的学号、课程号、学生成绩;
	
	35、查询每门课程成绩最好的前两名;
	
	36、检索至少选修两门课程的学生学号;
	
	37、查询全部学生都选修的课程的课程号和课程名;
	
	38、查询没学过“叶平”老师讲授的任一门课程的学生姓名;
	
	39、查询两门以上不及格课程的同学的学号及其平均成绩;
	
	40、检索“004”课程分数小于60,按分数降序排列的同学学号;
	
	41、删除“002”同学的“001”课程的成绩;

8、简述触发器、函数、视图、存储过程?
9、MySQL索引种类
10、索引在什么情况下遵循最左前缀的规则?
11、主键和外键的区别?
12、MySQL常见的函数?
13、列举 创建索引但是无法命中索引的8种情况。
14、如何开启慢日志查询?
15、数据库导入导出命令(结构+数据)?
16、数据库优化方案?
17、char和varchar的区别?
18、简述MySQL的执行计划?
19、在对name做了唯一索引前提下,简述以下区别:

select * from tb where name = ‘xxx’ 

    select * from tb where name = ‘xxx’ limit 1

20、1000w条数据,使用limit offset 分页时,为什么越往后翻越慢?如何解决?
21、什么是索引合并?
22、什么是覆盖索引?
23、简述数据库读写分离?
24、简述数据库分库分表?(水平、垂直)
25、redis和memcached比较?
26、redis中数据库默认是多少个db 及作用?
27、python操作redis的模块?
28、如果redis中的某个列表中的数据量非常大,如果实现循环显示每一个值?
29、redis如何实现主从复制?以及数据同步机制?
30、redis中的sentinel的作用?
31、如何实现redis集群?
32、redis中默认有多少个哈希槽?
33、简述redis的有哪几种持久化策略及比较?
34、列举redis支持的过期策略。
35、MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中都是热点数据?
36、写代码,基于redis的列表实现 先进先出、后进先出队列、优先级队列。
37、如何基于redis实现消息队列?
38、如何基于redis实现发布和订阅?以及发布订阅和消息队列的区别?
39、什么是codis及作用?
40、什么是twemproxy及作用?
41、写代码实现redis事务操作。
42、redis中的watch的命令的作用?
43、基于redis如何实现商城商品数量计数器?
44、简述redis分布式锁和redlock的实现机制。
45、什么是一致性哈希?Python中是否有相应模块?
46、如何高效的找到redis中所有以oldboy开头的key?

第四部分 前端、框架和其他(149题)

1、谈谈你对http协议的认识。
2、谈谈你对websocket协议的认识。
3、什么是magic string ?
4、如何创建响应式布局?
5、你曾经使用过哪些前端框架?
6、什么是ajax请求?并使用jQuery和XMLHttpRequest对象实现一个ajax请求。
7、如何在前端实现轮训?
8、如何在前端实现长轮训?
9、vuex的作用?
10、vue中的路由的拦截器的作用?
11、axios的作用?
12、列举vue的常见指令。
13、简述jsonp及实现原理?
14、是什么cors ?
15、列举Http请求中常见的请求方式?
16、列举Http请求中的状态码?
17、列举Http请求中常见的请求头?
18、django、flask、tornado框架的比较?
19、什么是wsgi?
20、django请求的生命周期?
21、列举django的内置组件?
22、列举django中间件的5个方法?以及django中间件的应用场景?
23、简述什么是FBV和CBV?
24、django的request对象是在什么时候创建的?
25、如何给CBV的程序添加装饰器?
26、列举django orm 中所有的方法(QuerySet对象的所有方法)
27、only和defer的区别?
28、select_related和prefetch_related的区别?
29、filter和exclude的区别?
30、列举django orm中三种能写sql语句的方法。
31、django orm 中如何设置读写分离?
32、F和Q的作用?
33、values和values_list的区别?
34、如何使用django orm批量创建数据?
35、django的Form和ModeForm的作用?
36、django的Form组件中,如果字段中包含choices参数,请使用两种方式实现数据源实时更新。
37、django的Model中的ForeignKey字段中的on_delete参数有什么作用?
38、django中csrf的实现机制?
39、django如何实现websocket?
40、基于django使用ajax发送post请求时,都可以使用哪种方法携带csrf token?
41、django中如何实现orm表中添加数据时创建一条日志记录。
42、django缓存如何设置?
43、django的缓存能使用redis吗?如果可以的话,如何配置?
44、django路由系统中name的作用?
45、django的模板中filter和simple_tag的区别?
46、django-debug-toolbar的作用?
47、django中如何实现单元测试?
48、解释orm中 db first 和 code first的含义?
49、django中如何根据数据库表生成model中的类?
50、使用orm和原生sql的优缺点?
51、简述MVC和MTV
52、django的contenttype组件的作用?
53、谈谈你对restfull 规范的认识?
54、接口的幂等性是什么意思?
55、什么是RPC?
56、Http和Https的区别?
57、为什么要使用django rest framework框架?
58、django rest framework框架中都有那些组件?
59、django rest framework框架中的视图都可以继承哪些类?
60、简述 django rest framework框架的认证流程。
61、django rest framework如何实现的用户访问频率控制?
62、Flask框架的优势?
63、Flask框架依赖组件?
64、Flask蓝图的作用?
65、列举使用过的Flask第三方组件?
66、简述Flask上下文管理流程?
67、Flask中的g的作用?
68、Flask中上下文管理主要涉及到了那些相关的类?并描述类主要作用?
69、为什么要Flask把Local对象中的的值stack 维护成一个列表?
70、Flask中多app应用是怎么完成?
71、在Flask中实现WebSocket需要什么组件?
72、wtforms组件的作用?
73、Flask框架默认session处理机制?
74、解释Flask框架中的Local对象和threading.local对象的区别?
75、Flask中 blinker 是什么?
76、SQLAlchemy中的 session和scoped_session 的区别?
77、SQLAlchemy如何执行原生SQL?
78、ORM的实现原理?
79、DBUtils模块的作用?
80、以下SQLAlchemy的字段是否正确?如果不正确请更正:

from datetime import datetime
from sqlalchemy.ext.declarative
import declarative_base
from sqlalchemy import Column, Integer, String, DateTime
Base = declarative_base()
class UserInfo(Base):
 	__tablename__ = 'userinfo'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(64), unique=True)
    ctime = Column(DateTime, default=datetime.now())

81、SQLAchemy中如何为表设置引擎和字符编码?
82、SQLAchemy中如何设置联合唯一索引?
83、简述Tornado框架的特点。
84、简述Tornado框架中Future对象的作用?
85、Tornado框架中如何编写WebSocket程序?
86、Tornado中静态文件是如何处理的?
如: <link href="{{static_url(“commons.css”)}}" rel=“stylesheet” />
87、Tornado操作MySQL使用的模块?
88、Tornado操作redis使用的模块?
89、简述Tornado框架的适用场景?
90、git常见命令作用:
91、简述以下git中stash命令作用以及相关其他命令。
92、git 中 merge 和 rebase命令 的区别。
93、公司如何基于git做的协同开发?
94、如何基于git实现代码review?
95、git如何实现v1.0 、v2.0 等版本的管理?
96、什么是gitlab?
97、github和gitlab的区别?
98、如何为github上牛逼的开源项目贡献代码?
99、git中 .gitignore文件的作用?
100、什么是敏捷开发?
101、简述 jenkins 工具的作用?
102、公司如何实现代码发布?
103、简述 RabbitMQ、Kafka、ZeroMQ的区别?
104、RabbitMQ如何在消费者获取任务后未处理完前就挂掉时,保证数据不丢失?
105、RabbitMQ如何对消息做持久化?
106、RabbitMQ如何控制消息被消费的顺序?
107、以下RabbitMQ的exchange type分别代表什么意思?如:fanout、direct、topic。
108、简述 celery 是什么以及应用场景?
109、简述celery运行机制。
110、celery如何实现定时任务?
111、简述 celery多任务结构目录?
112、celery中装饰器 @app.task 和 @shared_task的区别?
113、简述 requests模块的作用及基本使用?
114、简述 beautifulsoup模块的作用及基本使用?
115、简述 seleninu模块的作用及基本使用?
116、scrapy框架中各组件的工作流程?
117、在scrapy框架中如何设置代理(两种方法)?
118、scrapy框架中如何实现大文件的下载?
119、scrapy中如何实现限速?
120、scrapy中如何实现暂定爬虫?
121、scrapy中如何进行自定制命令?
122、scrapy中如何实现的记录爬虫的深度?
123、scrapy中的pipelines工作原理?
124、scrapy的pipelines如何丢弃一个item对象?
125、简述scrapy中爬虫中间件和下载中间件的作用?
126、scrapy-redis组件的作用?
127、scrapy-redis组件中如何实现的任务的去重?
128、scrapy-redis的调度器如何实现任务的深度优先和广度优先?
129、简述 vitualenv 及应用场景?
130、简述 pipreqs 及应用场景?
131、在Python中使用过什么代码检查工具?
132、简述 saltstack、ansible、fabric、puppet工具的作用?
133、B Tree和B+ Tree的区别?
134、请列举常见排序并通过代码实现任意三种。
135、请列举常见查找并通过代码实现任意三种。
136、请列举你熟悉的设计模式?
137、有没有刷过leetcode?
138、列举熟悉的的Linux命令。
139、公司线上服务器是什么系统?
140、解释 PV、UV 的含义?
141、解释 QPS的含义?
142、uwsgi和wsgi的区别?
143、supervisor的作用?
144、什么是反向代理?
145、简述SSH的整个过程。
146、有问题都去那些找解决方案?
147、是否有关注什么技术类的公众号?
148、最近在研究什么新技术?
149、是否了解过领域驱动模型?