阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

面向对象-单例

197次阅读
没有评论

共计 1935 个字符,预计需要花费 5 分钟才能阅读完成。

一、单例概述

  • 单例

    是一种软件设计模式,该模式的主要目的是让一个类只能实例化一个对象

  • 单例类

    在一个程序中只能实例化一个对象的类称为单例类

  • 设计模式

    前人总结的使用方案,我们现在可以直接使用,大约 23 种

  • 实现方式

    • 模块
    • __new__
    • 装饰器实现
    • 元类

二、使用模块实现单例

  • 原理

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

  • 银行卡类(card.py)

    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)

    from bankCard import card
    class Husband(object):
    def play(self):
    print(card.money)
  • 妻子类(wife.py)

    from bankCard import card
    class Wife(object):
    def face(self):
    card.money -= 100
  • 主文件(main.py)

    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)

    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)

    from bankCard import BankCard
    class Husband(object):
    def play(self):
    card = BankCard()
    print(card.money)
  • 妻子类(wife.py)

    from bankCard import BankCard
    class Wife(object):
    def face(self):
    card = BankCard()
    card.money = 1000
    card.money -= 100
  • 主文件(main.py)

    from wife import Wife
    from husband import Husband
    def main():
    w = Wife()
    h = Husband()
    w.face()
    h.play()
    if __name__ == "__main__":
    main()

四、使用装饰器实现单例

  • 银行卡类(card.py)

    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)

    from bankCard import BankCard
    class Husband(object):
    def play(self):
    card = BankCard()
    print(card.money)
  • 妻子类(wife.py)

    from bankCard import BankCard
    class Wife(object):
    def face(self):
    card = BankCard()
    card.money -= 200
  • 主文件(main.py)

    from wife import Wife
    from husband import Husband
    def main():
    w = Wife()
    h = Husband()
    w.face()
    h.play()
    if __name__ == "__main__":
    main()

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计1935字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中