python单例类_python-元类的几种单例模式

#单例模式:多次实例化的结果指向同一个实例

#单例模式实现方式一:

'''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.1.1.3',3302)

print(obj1)

print(obj2)

print(obj3)

print(obj4)'''

#单例模式实现方式二:

'''import settings

def singleton(cls):

_instance=cls(settings.IP,settings.PORT)

def wrapper(*args,**kwargs):

if len(args) !=0 or len(kwargs) !=0:

obj=cls(*args,**kwargs)

return obj

return _instance

return wrapper

@singleton #MySQL=singleton(MySQL) #MySQL=wrapper

class MySQL:

def __init__(self, ip, port):

self.ip = ip

self.port = port

# obj=MySQL('1.1.1.1',3306) #obj=wrapper('1.1.1.1',3306)

# print(obj.__dict__)

obj1=MySQL() #wrapper()

obj2=MySQL() #wrapper()

obj3=MySQL() #wrapper()

obj4=MySQL('1.1.1.3',3302) #wrapper('1.1.1.3',3302)

print(obj1)

print(obj2)

print(obj3)

print(obj4)'''

#单例模式实现方式三:

'''import settings

class Mymeta(type):

def __init__(self,class_name,class_bases,class_dic):

#self=MySQL这个类

self.__instance=self(settings.IP,settings.PORT)

def __call__(self, *args, **kwargs):

# self=MySQL这个类

if len(args) != 0 or len(kwargs) != 0:

obj=self.__new__(self)

self.__init__(obj,*args, **kwargs)

return obj

else:

return self.__instance

class MySQL(metaclass=Mymeta): #MySQL=Mymeta(...)

def __init__(self, ip, port):

self.ip = ip

self.port = port

obj1=MySQL()

obj2=MySQL()

obj3=MySQL()

obj4=MySQL('1.1.1.3',3302)

print(obj1)

print(obj2)

print(obj3)

print(obj4)'''

#单例模式实现方式四:

deff1():from singleton importinstanceprint(instance)deff2():from singleton importinstance,MySQLprint(instance)

obj=MySQL('1.1.1.3',3302)print(obj)

f1()

f2()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值