单例的四种实现方式:
配置文件settings
IP = 1.1.1.1
PORT = 8080
实现方式一(内置方法):
import settings
class Foo: _instance = None def __init__(self,IP,ROPT): self.IP = IP self.ROPT = PORT @classmethod def from_conf(cls): if not _instance: cls._instance = cls(settings.IP,setting.ROPT) return cls._instance
obj1= Foo.from_conf()
obj2 = Foo.from_conf()
obj3 = Foo(223,456)
实现方式二(装饰器):
原理是:被装饰器装饰的类或者行数,在被调用时实际上是调用了装饰器中的 wrapper,而整个装饰器只会在检测到@的时候执行一次
import settings
def dl(cls): _instance = cls(settings.IP,settings.PORT) def wrapper(*args,**kwargs): if args or kwargs: obj = cls(*args,**kwargs) return obj else: return _instance return wrapper
@dl
def Foo():
def __init__(self,IP,ROPT):
self.IP = IP
self.ROPT = PORT
obj1 = Foo()
obj2 = Foo()
obj3 = Foo(123,566)
实现方式三(元类):
原理:元类中的__class__可以控制类被创建后再次的再次调用
class Mymeta(type): def __init__(self,class_name,class_base,class_dic): self.__instance = self(settings.IP,settings.PORT) def __class__(self,*args,**kwargs): if args or kwargs: obj = self.__new__(self) self.__init__(obj,*args, **kwargs) return obj else: return self.__instance class Foo(metaclass=Mymeta): def __init__(self,ip,jk): self.ip = ip self.jk = jk obj1 = Foo() obj2 = Foo() print(obj1) print(obj2)
实现方式四(调用模块):
原理:模块只会被导入一次,以后的每次导入都是基于上一次的导入的结果而进行
module.py文件
import settings class Foo: def __init__(self,IP,PORT): self.IP = IP self.PORT = PORT _instance = Foo(settings.IP,settings.PORT)
import module obj1 = module._instance obj2 = module._instance obj3 = module.Foo(123,456)
网络编程(简介):
C/S:Client--------基于网络---------Server
B/S:Browser-----基于网络---------Server
OSI七层协议:也可以总结为5层
1 应用 2 传输层 3 网络层 4 数据链路层 5 物理层
2 服务端
1 服务端与客户端都需要有唯一的地址,但是服务端的地址必须固定/绑定
2 对外一直提供稳定的服务,稳定运行
3 服务端应该支持并发