• python设计模式之单例


    
    

    理解:所谓单例,是指一个类的实例从始至终只能被创建一次。

     

    method 1:使用__new__方法会很简单。Python中类是通过__new__来创建实例的

    首先:

    __new__() 方法的特性:

    __new__() 方法是在类准备将自身实例化时调用。

    __new__() 方法始终都是类的静态方法,即使没有被加上静态方法装饰器。

    继承自object的新式类才有__new__。
    __new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供。
    __new__必须要有返回值,返回实例化出来的实例,这点在自己实现__new__时要特别注意,可以return父类__new__出来的实例,或者直接是object的__new__出来的实例。
    __init__有一个参数self,就是这个__new__返回的实例,__init__在__new__的基础上可以完成一些其它初始化的动作,__init__不需要返回值。

    若__new__没有正确返回当前类cls的实例,那__init__是不会被调用的,即使是父类的实例也不行。

    #coding='utf-8'

    class Singleton(object):
    def __new__(cls, *args, **kwargs):
    if not hasattr(cls,'_instance'):
    cls._instance = super().__new__(cls)
    return cls._instance
    if __name__ == '__main__':
    class A(Singleton):
    def __init__(self,s):
    self.s = s

    a = A('apple')
    b = A('bannana')
    print(id(a), a.s)
    print(id(b), b.s)

    print("***%%%%%****")

    #python3
    class Singleton(object):
    __instance = None

    def __new__(cls, *args, **kwargs):
    if cls.__instance is None:
    # cls.__instance = super().__new__(cls)
    # cls.__instance = object.__new__(cls)
    cls.__instance = super().__new__(cls)
    return cls.__instance

    def __init__(self, status_number):
    self.status_number = status_number

    test1 = Singleton("2")
    print(id(test1),test1.status_number)

    test2 = Singleton("3")
    print(id(test2),test2.status_number)
    class Foo(object):
    def __new__(cls, *args, **kwargs):
    if not hasattr(cls, '_instance'):
    cls._instance = super().__new__(cls)
    return cls._instance
    class A(Foo):
    def __init__(self,s):
    self.s = s
    a = A('apple')
    b = A('bannana')
    print(id(a))
    print(id(b))
    # a = Foo()
    # b = Foo()
    # print(id(a)==id(b))
  • 相关阅读:
    ssh用法及命令
    FFmpeg开发——深入理解pts,dts和timebase
    .Net Core服务诊断排查Dump抓取
    Django 简单示例
    Django 安装
    Django 视图 Views
    Django Cross Site Request Forgery
    Django 模板标签(变量 列表 字典)
    19 Python 3 Object Oriented
    Django 模型(与数据库交互)
  • 原文地址:https://www.cnblogs.com/wiki918/p/11942982.html
Copyright © 2020-2023  润新知