第一种方法:通过类的绑定方法
当用户输入端口,实例化产生新对象
当用户不输入端口和地址,每次拿到的对象,都是同一个
class Sql():
instance = None
def init(self,port,host):
self.port = port
self.host = host
@classmethod
def get_sigoleton(cls):
# import settings
if not cls.instance:
cls.instance = cls(3306,'127.0.0.1')
return cls.instance
# 每次调用get_sigoleton 拿到的都是同一个
p1 = Sql.get_sigoleton()
p2 = Sql.get_sigoleton()
print(p1)
print(p2)
第二种方式:装饰器
def get_sigoleton(func):
import settings
instance = func(settings.PORT, settings.HOST)
def wrapper(*args,**kwargs):
if len(args)!=0 or len(kwargs)!=0:
res = func(*args,**kwargs)
return res
else:
return instance
return wrapper
@get_sigoleton # 相当于:Spl=get_sigoleton(Spl)
class Sql():
instance = None
def init(self,port,host):
self.port = port
self.host = host
s1 = Sql()
s2 = Sql()
print(s1)
print(s2)
print(p1)
print(p2)
第三种方式:元类
class Mymeta(type):
def init(self,name,bases,dic):
import settings
self.instance = self(settings.PORT,settings.HOST)
def call(self,*args,**kwargs):
if len(args)!=0 or len(kwargs)!=0:
obj = object.new(self)
obj.init(*args,**kwargs)
return obj
else:
return self.instance
class Sql(metaclass=Mymeta):
def init(self,port,host):
self.port = port
self.host = host
s1 = Sql()
s2 = Sql()
print(s1)
print(s2)
第四种方式:模块
写一个模块
from XXX import 对象名
class Sql:
def init(self,port,host):
self.port = port
self.host = host
s1 = Sql('默认值','默认值')
def test1():
from XXX import 对象名 # 对象已经生成
print(对象名)
def test2():
from XXX import 对象名 # as XXX 重命名
print(对象名)
test1()
test2()