一,什么是封装?
类是一种封装,将属性和方法封装。
函数也是一种封装,将具有一定共的逻辑代码封装到一个函数中,使用的时候调用即可
提高代码的扩展性。
二,什么是继承?
将公共的(共性的)属性和方法放在父类中,子类只关注自己特有的属性和方法。
提高代码的扩展性。
三,什么是多态?
一个对象在不同的情况下,具有不同的形态,用于强类型语言。是使用在继承和接口中实现。
Python中有两种说法:
1、python支持多态,python是一个弱类型,本身一个变量名,可以存储任何类型的值,可以理解为多种形态
2、python不支持多态,多态本身是用于强类型语言的,python是一个弱类型,所以不支持多态
类的建议使用 类名.类方法名()
对象里存放两种内容
1.实例属性
2.指向类对象的指针
之前对象的属性,是实例属性
实例属性:
只能通过实例对象调用
通过实例对象调用修改
每个实例对象拥有自己的,使用实例属性
类属性:
实例对象和类对象都能访问
通过类对象调用修改
所有实例对象共同拥有一个,使用类属性
self:当前实例对象
cls:当前类对象
实例方法:
通过实例对象调用,至少有一个参数,一般叫self,表示当前实例对象,自动赋值
类方法:
@classmethod
通过实例对象和类对象都调用,一般叫cls,表示当前类对象,自动赋值
静态方法:
@staticmethod
通过实例对象和类对象都调用,可以有参数,也可以没有参数,手动赋值
类对象:拥有相同属性的行为和属性的对象都可以抽出一个类;一般的方法都是类
实例对象:当创建一个对象时,就是用一个模子,来创造一个实物。
面向对象的理解:
面向对象是一种设计思想
1.符合人们的思考习惯
2.把执行者变成指挥者
3.简化功能,把复杂的事情简单化
想完成一个事,找具有这样功能的对象
如果能找到,调用这个对象的功能,完成这个事
如果找不到,创建具有这样功能的对象,再调用完成这个事
面向对象有三大特征:
1.封装
2.继承
3.多态
面试题:
1、你对面向对象的理解
2、面向对象的特征是什么
3、对封装的理解?
封装,类本身就是一个封装,封装了属性和方法。方法也是封装,对一些业务逻辑的封装。私有也是封装,将一些方法和属性私有化,对外提供可访问的接口。
4、对继承的理解
将共性的内容放在父类中,子类只需要关注自己特有的内容,共性的继承过来就行了。
这样简化开发,符合逻辑习惯,利于扩展。
5、多态的理解
多态,一个对象在不同的情况下显示不同的形态。在python中因为是弱类型语言,对类型没有限定,所有python中不完全支持多态,但是多态的思想呢,python也是能体现的。
- TCP长/短连接的应用场景
(1)长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。
每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,
再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,
再次处理时直接发送数据包就OK了,不用建立TCP连接。
例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,
而且频繁的socket 创建也是对资源的浪费。
(2)而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,
而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,
如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,
那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
四,数据库方面。
1.视图
(1)本质:视图本质就是对查询的一个封装,虚拟的表。
(2)定义:
create view stuscore as
select students.*,scores.score from scores
inner join students on scores.stuid=students.id;
(3)作用:
提高了重用性,就像一个函数
对数据库重构,却不影响程序的运行
提高了安全性能,可以对不同的用户
让数据更加清晰
2.索引
(1)索引是什么
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度
(2)什么情况用索引
数据量大,经常做查询,很少做修改,适合将这样的列作为索引。
(3)目的
索引的目的在于提高查询效率
(4)创建索引
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分
create index 索引名称 on 表名(字段名称(长度))
3.账户管理
(1)怎样创建账户并且授权
需要使用实例级账户登录后操作,以root为例
常用权限主要包括:create、alter、drop、insert、update、delete、select
如果分配所有权限,可以使用all privileges
创建账户&授权
grant 权限列表 on 数据库 to '用户名'@'访问主机' identified by '密码';
创建账户并授予所有权限
grant select on jing_dong.* to 'laowang'@'localhost' identified by '123456';
说明:
可以操作python数据库的所有表,方式为:jing_dong.*
访问主机通常使用 百分号% 表示此账户可以使用任何ip的主机登录访问此数据库
访问主机可以设置成 localhost或具体的ip,表示只允许本机或特定主机访问
4,悲观锁和乐观锁
(1)悲观锁:
在查询的时候,锁起来,事务结束后,释放。
悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。通常所说的“一锁二查三更新”即指的是使用悲观锁。通常来讲在数据库上的悲观锁需要数据库本身提供支持,即通过常用的select … for update操作来实现悲观锁。当数据库执行select for update时会获取被select中的数据行的行锁,因此其他并发执行的select… for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用。
(2)乐观锁:
查询的时候,不需要操作,更改的时候再判断。
乐观锁的特点先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁就好。
乐观锁在数据库上的实现完全是逻辑的,不需要数据库提供特殊的支持。一般的做法是在需要锁的数据上增加一个版本号,或者时间戳。
总结:
乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能
乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方