# 单例模式:
# 实现目的:实例化多次,得到的实例是同一个,就是同一个对象,同一个名称空间(更加节省空间)
####################################方式一:在类内部定义一个类方法#################################
import settings
class Mysql:
__instance=None #定义一个变量,来接收实例化对象,方便下面做判断
def __init__(self,ip,port):
self.ip=ip
self.port=port
#
@classmethod #做成类方法 #绑定给Mysql类去直接调用实例化
def from_conf(cls):
#目的是要调取mysql这个类通过从配置文件读取IP、端口参数,完成调用init方法,拿到一个实例化init方法的对象
# mysql(settings.IP,settings.PORT)
#如果是这样每次,实例化出的对象,都是不同的名称空间,但是数据是同一份
# return cls(settings.IP,settings.PORT) #cls(ip,port) 就是调用init方法
#演变最终版:思考可以统一定义一个初始变量__instance=None,将第一次实例的对象传给他,有每次外面再访问就直接
if cls.__instance is None:
cls.__instance=cls(settings.IP,settings.PORT)
return cls.__instance
#之前版本:
# p1=Mysql.from_conf()
# print(p1) #<__main__.mysql object at> #数据是同一份,但每次实例化,指向的都是不同的内存地址
# p2=Mysql.from_conf()
# print(p2) #<__main__.mysql object at>
#这样写就完美的实现了隔离:
#升级版本后,可以实现,访问存的东西一样的,可以指向同一个内存空间
obj=Mysql.from_conf()
print(obj.__dict__)
#也可以传入新的参数,另外新造一个名称空间
obj2=Mysql('3.3.3.3',8888)
print(obj2.__dict__)