9.4(day30)元类,单例模式,单例模式的四种实现方式

第一种方法:通过类的绑定方法

当用户输入端口,实例化产生新对象

当用户不输入端口和地址,每次拿到的对象,都是同一个

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()

posted @ 2019-09-16 20:00  ZJJJJJJJ  阅读(114)  评论(0编辑  收藏  举报