单例设计模式的练习

单例设计模式

有关的知识点

class A(object):
    def __init__(self):
        print("这是 init 方法")

    def __new__(cls):
        print("这是 new 方法")
        return object.__new__(cls)  #返回的是一个实例了的对象  就是self

__new__至少要有一个参数cls,代表要实例化的类(一般就是本类),此参数在实例化时由Python解释器自动提供

__new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,
可以return父类__new__出来的实例(父类没有自己实现的话还是会去找基类的),或者直接是object的__new__出来的实例

__init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值
# 实例化一个单例
class Singleton(object):
    __instance = None  # 私有类的属性(就是私有了一个类的对象)

    def __new__(cls, age, name):  # 这个方法会返回一个对象  就是self对象
        # 如果类属性中是否指向了一个对象  如果没有
        # 那么就创建一个对象,并且赋值为这个对象的引用,保证下次调用这个方法时
        # 能够知道之前已经创建过对象了,这样就保证了只有1个对象
        if not cls.__instance:  # 判断类的属性是否存在
            cls.__instance = object.__new__(cls)  # 不能存在就创建一个类的是实例对象
        return cls.__instance  # 返回类的实例对象

保证单例的设计模式只能初始化一次

如果只是简简单单的完成了类的单例 那么当去创建一个对象并调用init(self) 方法的时候 当创建多个对象 并初始化多次的时候 最后初始化的属性
会覆盖前面初始化过的属性,为了防止多次的初始化 我们可以在初始化中在加一层判断

class Demo:

    __instance=None # 用于单例创建时对象的赋值和引用
    __flag=False  # 用于控制初始化时的判断

    def __new__(cls,*args):
        if not cls.__instance:  # 判断对象是否存在
            cls.__instance=object.__new__(cls)  # 把创建的对象赋值给 类的属性
        return cls.__instance  # 返回创建的对象

    def __init__(self,name):
        if not Demo.__falg:  # 判断标志位
            self.name=name  # 初始化对象的属性值
            Demo.__falg=True  # 设置标志位  这样当下次再创建对象的时候就不会在进行初始化操作了

demo=Demo("haha")
print(id(demo))  # 打印对象的内存地址  
print(demo.name) # 打印属性
# 创建对象2
denmo2=Demo("hehe")
print(id(demo2))  # 打印对象的内存地址
print(demo2.name)  # 打印属性


结果:
139798882285720
haha
139798882285720
haha
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值