Python入门学习
DAY30
今日内容: 单例模式 网络编程介绍
单例模式
什么是单例模式
指多次实例化的结果指向同一个实例
列:
设置一个settings配置文件
IP='1.1.1.1'
PORT=3306
单例模式实现方式一:定义一个类方法实现单例模式
import settings
class MySQL:
__instance = None
def __init__(self, ip, port):
self.ip = ip
self.port = port
@classmethod
def from_conf(cls):
if cls.__instance is None:
cls.__instance = cls(settings.IP, settings.PORT)
return cls.__instance
obj1 = MySQL.from_conf()
obj2 = MySQL.from_conf()
obj3 = MySQL.from_conf()
obj4 = MySQL('1.2.3.4', 8080)
print(obj1) #<__main__.MySQL object at 0x02A8A0D0>
print(obj2) #<__main__.MySQL object at 0x02A8A0D0>
print(obj3) #<__main__.MySQL object at 0x02A8A0D0>
print(obj4) #<__main__.MySQL object at 0x02A8A0B0>
单例模式实现方式二:定制元类实现单例模式
import settings
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
self.__instance=self(settings.IP,settings.PORT)
def __call__(self,*args,**kwargs):
if args or kwargs:
obj=self.__new__(self)
self.__init__(obj,*args,*kwargs)
return obj
return self.__instance
class MySQL(metaclass=Mymeta):
def __init__(self,ip,port):
self.ip=ip
self.port=port
obj1=MySQL()
obj2=MySQL()
obj3=MySQL()
obj4=MySQL('1.2.3.4',8080)
print(obj1) #<__main__.MySQL object at 0x0314A0B0>
print(obj2) #<__main__.MySQL object at 0x0314A0B0>
print(obj3) #<__main__.MySQL object at 0x0314A0B0>
print(obj4) #<__main__.MySQL object at 0x0314A0F0>
单例模式实现方式三:定义一个装饰器实现单例模式
import settings
def sinleton(cls):
cls.__instance = cls(settings.IP, settings.PORT)
def wrapper(*args, **kwargs):
if args or kwargs:
obj = cls(*args, **kwargs)
return obj
return cls.__instance
return wrapper
@sinleton
class MySQL:
def __init__(self, ip, port):
self.ip = ip
self.port = port
obj1 = MySQL()
obj2 = MySQL()
obj3 = MySQL()
obj4 = MySQL('1.2.3.4', 8080)
print(obj1) #<__main__.MySQL object at 0x0339A0F0>
print(obj2) #<__main__.MySQL object at 0x0339A0F0>
print(obj3) #<__main__.MySQL object at 0x0339A0F0>
print(obj4) #<__main__.MySQL object at 0x0339A0D0>
单例模式实现方式四:利用python不会重复导入包的机制
创建一个py文件 sinleton.py
import settings
class MySQL:
def __init__(self,ip,port)
self.ip=ip
self.port=port
instance=MySQL(settings.ip,settings.port)
在执行文件中:
def func1():
from sinleton import instance
print(instance) #<sinleton.MySQL object at 0x02ACA190>
def func2():
from sinleton import instance,MySQL
print(instance) #<sinleton.MySQL object at 0x02ACA190>
obj=MySQL('1.2.3.4',8080)
print(obj) #<sinleton.MySQL object at 0x02A71370>
func1()
func2()
网络编程介绍
1. 什么是c/s 和 b/s
c/s: Client(客户端) -------基于网络-------Server(服务端)
b/s: Browser(浏览器) -------基于网络-------Server(服务端)
2. 服务端需要遵循的原则
服务端与客户端都需要有唯一的地址,但是服务端的地址必须固定/绑定
对外一直提供服务,稳定运行
服务端应该支持并发
3. 网络
网络的建立的目的是为了数据交互(通信)
如何实现通信:
1. 建立好底层的物理连接介质
2. 有一套统一的通信标准,称之为互联网协议
4. 互联网协议
互联网协议按照功能不同分为osi七层或tcp/ip五层或tcp/ip四层
OSI 七层协议
物理层 数据链路层 网络层 传输层 应用层 (会话层 表示层 )
物理层:主要是基于电器特性发送高低电压(电信号),高电压对应数字1,低电压对应数字0
数据链路层:定义了电信号的分组方式(以太网协议)
网络层:引入网络地址用来区分不同的广播域/子网(ip协议,子网掩码,ARP协议)
传输层:建立端口到端口的通信(tcp协议,udp协议)
应用层:规定应用程序的数据格式(http协议 ftp协议)
以上为本次学习内容