前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象-单例

面向对象-单例

作者头像
星哥玩云
发布2022-09-08 13:06:45
2100
发布2022-09-08 13:06:45
举报
文章被收录于专栏:开源部署

一、单例概述

  • 单例 是一种软件设计模式,该模式的主要目的是让一个类只能实例化一个对象
  • 单例类 在一个程序中只能实例化一个对象的类称为单例类
  • 设计模式 前人总结的使用方案,我们现在可以直接使用,大约23种
  • 实现方式
    • 模块
    • __new__
    • 装饰器实现
    • 元类

二、使用模块实现单例

原理

python的模块就是天然的单例模式,因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。因此我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了

银行卡类(card.py)

代码语言:javascript
复制
class BankCard(object):
    def __init__(self, cardId, passwd, money):
        self.cardId = cardId
        self.passwd = passwd
        self.money = money

card = BankCard("888888", "888888", 1000)

丈夫类(husband.py)

代码语言:javascript
复制
from bankCard import card

class Husband(object):
    def play(self):
        print(card.money)

妻子类(wife.py)

代码语言:javascript
复制
from bankCard import card

class Wife(object):
    def face(self):
        card.money -= 100

主文件(main.py)

代码语言:javascript
复制
from wife import Wife
from husband import Husband


def main():
    w = Wife()
    h = Husband()

    w.face()
    h.play()

if __name__ == "__main__":
    main()

三、使用__new__实现单例

银行卡类(card.py)

代码语言:javascript
复制
class BankCard(object):
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "instance"):
            # 调用父类中的__new__()得到混沌对象
            cls.instance = super().__new__(cls)
        return cls.instance

    def __init__(self):
        self.cardId = "88888888"
        self.passwd = "88888888"

丈夫类(husband.py)

代码语言:javascript
复制
from bankCard import BankCard

class Husband(object):
    def play(self):
        card = BankCard()
        print(card.money)

妻子类(wife.py)

代码语言:javascript
复制
from bankCard import BankCard

class Wife(object):
    def face(self):
        card = BankCard()
        card.money = 1000

        card.money -= 100

主文件(main.py)

代码语言:javascript
复制
from wife import Wife
from husband import Husband


def main():
    w = Wife()
    h = Husband()

    w.face()
    h.play()

if __name__ == "__main__":
    main()

四、使用装饰器实现单例

银行卡类(card.py)

代码语言:javascript
复制
def single(cls):
    # Person:obj,A:obj
    instance = {}
    def inner(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return inner

@single
class BankCard(object):
    def __init__(self):
        self.cardId = "88888888"
        self.passwd = "88888888"
        self.money = 1000

@single
class A(object):
    pass

丈夫类(husband.py)

代码语言:javascript
复制
from bankCard import BankCard

class Husband(object):
    def play(self):
        card = BankCard()
        print(card.money)

妻子类(wife.py)

代码语言:javascript
复制
from bankCard import BankCard

class Wife(object):
    def face(self):
        card = BankCard()

        card.money -= 200

主文件(main.py)

代码语言:javascript
复制
from wife import Wife
from husband import Husband


def main():
    w = Wife()
    h = Husband()

    w.face()
    h.play()

if __name__ == "__main__":
    main()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、单例概述
  • 二、使用模块实现单例
  • 三、使用__new__实现单例
  • 四、使用装饰器实现单例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档