Loading

25、面向对象(单例)


25.1、介绍:

1、单例即单个实例,指的是同一个类实例化多次的结果指向同一个对象,用于节省内存空间;

2、如果我们从配置文件中读取配置来进行实例化,在配置相同的情况下,就没必要重复产生对象浪费内存了;


25.2、示例:

1、定义一个 settings.py 文件内容如下:

HOST='1.1.1.1'

PORT=3306


2、定义一个类方法实现单例模式:

import settings


class Mysql:

__instance = None

# 定义一个类的实例化数据属性


def __init__(self, host, port):

self.host = host

self.port = port


@classmethod

# 定义一个类方法

def singleton(cls):

if not cls.__instance:

cls.__instance = cls(settings.HOST, settings.PORT)

# 如果实例不存在就创建实例

return cls.__instance

# 如果实例存在就返回存在的实例



obj1 = Mysql('1.1.1.2', 3306)

obj2 = Mysql('1.1.1.2', 3306)

print(obj1 is obj2)

# obj1和obj2不是同一个对象

# False


obj3 = Mysql.singleton()

obj4 = Mysql.singleton()

print(obj3.host, obj3.port, obj4.host, obj4.port)

# 1.1.1.1 3306 1.1.1.1 3306

print(obj3 is obj4)

# obj3和obj4是同一个对象

# True


3、定义一个装饰器实现单例模式:

import settings


#3

def singleton(cls): # cls = Mysql

#4

__instance = cls(settings.HOST, settings.PORT)

#5

def wrapper(*args, **kwargs):

if args or kwargs:

obj = cls(*args, **kwargs)

return obj

return __instance

#6

return wrapper


#2

@singleton # Mysql = singleton(Mysql) = wrapper

class Mysql:

def __init__(self, host, port):

self.host = host

self.port = port


#1

obj1 = Mysql()

obj2 = Mysql()

obj3 = Mysql()

print(obj1 is obj2 is obj3)

# True


obj4 = Mysql('1.1.1.3', 3308)

obj5 = Mysql('1.1.1.3', 3308)

print(obj3 is obj4)

# False








posted @ 2020-02-17 09:58  云起时。  阅读(161)  评论(0)    收藏  举报