复习面向对象和网络编程TCP前部分
复习(面向对象+socket(网络)编程)
1、 Foo.x 《=》 Foo.__dict__['x']
2、 import settings
import uuid
class Mysql:
def __init__(self,host,port):
self.host=host
self.port=port
def tell_info(self):
print("<%s:%s>" %(self.host,self.port))
@classmethod
def from_conf(cls):
return cls(settings.HOST, settings.PORT)
@staticmethod
def create_id():
return uuid.uuid4()
classmethod常见用法:利用类来提供一种额外的实例化的方式
staticmethod常见用法:类内部新增一个既不需要self也不需要cls的功能
一、面向对象复习
a、函数与类
01 没有使用函数之前编程遇到的问题?
1、代码冗余
2、程序组织结构不清晰
3、可扩展性差
02 从代码级别看面向对象:类将功能以及可以调用这些功能的数据绑定在一起,使得程序组织结构进一步清晰化,可扩展型增强
03 定义函数与定义类的区别:
定义函数只检测语法不执行函数体代码
定义类会立刻执行类体代码,会产生类的名称空间,将类体代码执行过程中产生的名字都存放到类的名称空间中
存的目的是为了取,要想从类的名称空间中取出我们定义的名字
Foo.__dict__['host']
04 访问属性的语法
Foo.属性名
Foo.属性名=1
del Foo.属性名
05 类的使用
调用类来产生对象:1、会先产生一个空对象stu1 2、将stu1,连同括号内的参数一起传给Student.__init__(stu1,'egon',18,'male')
对象的本质与类一样,都是一个用来存放名字的容器,即名称空间
b、面向对象
01 什么是对象
对象是特征与技能的结合体
特征: 变量
技能:函数
02 什么是类
类一系列对象相似的特征与技能的结合体
03 定义类的目的:
是为了调用类来产生对象,对象是变量+函数
c、继承与派生
01 什么是继承?
继承创建类的方式,创建的字类可以遗传父类功能或属性
特点:python支持多继承
优点:减少代码冗余
缺点:把子类与父类强耦合到一起
02 A没有继承B,但是A内super会基于C.mro()继续往后找
class A(object):
def test(self):
super().test()
class B(object):
def test(self):
print('from B')
class C(A,B):
pass
c=C()
c.test()
print(C.mro())
d、多态与多态性
01 抽象类
import abc
class File(metaclass=abc.ABCMeta): #同一类事物:文件
@abc.abstractmethod
def clickk(self):
pass
02 鸭子类型
class Text: #文件的形态之一:文本文件
def click(self):
print('open file')
class ExeFile: #文件的形态之二:可执行文件
def click(self):
print('execute file')
class Process:
def click(self):
pass
e、封装 (明确区分内外)
01 对数据类型进行封装: 通过接口调用控制规范用户对改数据的增删改查
02 对函数类型进行封装: 隔离复杂度
class ATM:
def __card(self):
print('插卡')
def __auth(self):
print('用户认证')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印账单')
def __take_money(self):
print('取款')
def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money()
obj=ATM()
obj.withdraw()
f、面向对象重点知识
01 ******
为什么要用面向对象
什么时候用面向对象
如何用面向对象:类与对象
02 类的使用(*****)
1、定义类
2、引用类的属性
3、调用类产生对象---》实例化
03 对象的使用(*****)
1、引用对象属性
2、属性查找:对象-》对象的类---》父类。。。
3、绑定方法的自动传值
04 面向对象三大特性(*****):
1、继承
1、继承与组合(*****)
2、抽象类(**)
3、新式类与经典类以及灵性继承问题(*****)
4、在子类重用父类的功能(*****)
2、多态:指的是可以在不考虑对象具体类型的前提下直接使用对象
python崇尚的鸭子类型(*****)
3、封装
1、__语法的自动变形:
注意点:(*****)
2、封装的目的:明确地区分内外,内可以用,外不能直接用(*****)
1:封装数据属性:让外部使用者间接地操作数据,在接口上附加额外的逻辑
2:封装函数属性:隔离复杂度
g、类内部装饰器的使用
01 property
class People:
def __init__(self,name,weight,height):
self.__name=name
self.wt=weight
self.ht=height
@property
def bmi(self):
return self.wt / (self.ht ** 2)
@property
def name(self):
return self.__name
@name.setter
def name(self,obj): #obj='EGON'
if not isinstance(obj,str):
raise TypeError('名字的值必须是str类型')
self.__name=obj #self.__name='EGON'
@name.deleter
def name(self):
del self.__name
p=People('egon',75,1.80)
print(p.bmi)
print(p.name)
p.name='EGON'
p.name=123
print(p.name)
del p.name
02 classmethod
03 staticmethod
二、socket(网络)编程
a、 知识点概览
1、C/S B/S架构(*****)
c:client
s:server
b:browser
学习目标:开放一个客户端软件和服务端软件,两者基于网络通信
2、什么是网络?(*****)
1、物理连接介质
2、互联网协议(计算机界的英语)
3、OSI七层协议(**)
C/S
B/S
应(应、表、会):应用软件自定义协议,HTTP,FTP,HTTP+SSL
传输层:TCP、UDP基于端口
网络层:IP基于IP地址
数据链路层:Ethernet基于mac地址
物理层
4、如何标识全世界范围内独一无二的一个socket程序(*****)
ip+port
5、什么是socket(*****)
socket是位于应用层与传输层之间的一层抽象接口层
socket封装了tcp以下的协议,我们在编写网络通信的程序时只需要遵循socket的规范
写出的程序自然遵循tcp或udp协议
6、TCP与UDP协议(*****)
三次握手建连接
四次挥手断连接
tcp:
优点:
发一条数据必须收对方的确认后才会从自己的操作系统缓存清楚该条消息,否则重发
可靠协议
缺点:
发送数据效率必须udp低
udp:
优点:
发送数据效率高
缺点:
发一条数据无需收到对方的确认消息,会立刻从自己的操作系统缓存清楚该条消息
不可靠
b、 服务端:
import socket
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# print(server)
#服务端和客户端都需要有ip和port,但 只有服务端才绑定ip和port
server.bind(('127.0.0.1',8080))
server.listen(5) # 半连接池:限制的是请求数,而不是连接数
while True:
conn,client_addr=server.accept() # 等待客户端发来连接请求
print(conn)
while True:
try:
data=conn.recv(1024) #1024 接收数据的最大限制
if not data:break #针对linux系统
conn.send(data.upper()) # 注意:收发都是以bytes为单位
except ConnectionResetError:
break
conn.close()
server.close()
客户端:
import socket
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080))
while True:
msg=input('>>: ').strip()
client.send(msg.encode('utf-8'))
data=client.recv(1024)
print(data.decode('utf-8'))
client.close()