zoukankan      html  css  js  c++  java
  • 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))
  • 相关阅读:
    2018年产品设计协作领域最强黑马居然是它?
    中小企业网页设计,轻松拓展网络市场
    那些年,UI设计师还在手工标注和切图时走的弯路
    据说,攻城狮也可以像设计狮一样切图了?
    拼图类APP原型模板分享——简拼
    UI设计初学者必看,这款设计神器教你快速入门
    设计交付指南:设计师与开发如何才能好好协作?
    用户体验设计师面试中可能会问及的10个高频问题
    产品,设计和开发,高效协同只差一份文档
    素数
  • 原文地址:https://www.cnblogs.com/wiki918/p/11942982.html
Copyright © 2011-2022 走看看