美文网首页
2018-10-08 Python20 __方法__、单例模式

2018-10-08 Python20 __方法__、单例模式

作者: 孟媛的笔记 | 来源:发表于2018-10-08 15:58 被阅读0次

    __方法__

      1 class Dog(object):
      2     def __init__(self):   #初始化对象
      3         print("__init__")
      4 
      5     def __del__(self):    #对象销毁时自动调用
      6         print("__del__")  #死之前说的最后一句话,做的最后一件事
      7 
      8     def __str__(self):    #打印对象时输出,相当于Java的toString()
      9         return "对象的描述信息"
     10 
     11     def __new__(cls):     #创建对象,返回对象的引用
     12         print(id(cls))
     13         print("__new__")
     14         return super().__new__(cls)   #object.__new__(cls) 
     15 
     16 
     17 print(id(Dog))
     18 xtq = Dog()  
      # Python解析器看到这句话,会做三件事: 
      # 1.先调__new__方法(创建对象)
      # 2.再调__init__方法(将对象的引用传进去)(初始化对象)
      # 3.返回对象的引用。
     19 print(xtq)
    

    运行:

    22921128
    22921128
    __new__
    __init__
    对象的描述信息
    __del__
    

     


     

    单例模式:

    1 class Singleton(object):
      2     #类的私有属性
      3     __instance = None
      4 
      5     def __new__(cls):
      6         if cls.__instance == None:   #此刻用cls. 相当于用Singleton. 都是类对象的引用
      7             cls.__instance = super().__new__(cls)
      8             return cls.__instance
      9         else:
     10             return cls.__instance
     11 
     12 a = Singleton()
     13 b = Singleton()
     14 print(id(a))
     15 print(id(b))
    

    运行:

    140012620405448
    140012620405448
    

     


     

    Python的构造方法相当于:既调__new__方法、又调__init__方法。
    所以在构造的时候传的实参,要同时在__new____init__方法上申明形参。

     

    如何只初始化一次:

    定义一个类属性flag来判断,第一次初始化后改变其值。

      1 class Singleton(object):
      2     #类的私有属性
      3     __instance = None
      4     __init_flag = False
      5 
      6     def __new__(cls, new_name):
      7         if cls.__instance == None:
      8             cls.__instance = super().__new__(cls)
      9             return cls.__instance
     10         else:
     11             return cls.__instance
     12 
     13     def __init__(self, new_name):
     14         if Singleton.__init_flag == False:
     15             self.name = new_name
     16             Singleton.__init_flag = True
     17 
     18 
     19 
     20 a = Singleton("旺财")
     21 print(id(a))
     22 print(a.name)
     23 
     24 b = Singleton("哈士奇")
     25 print(id(b))
     26 print(b.name)
    

    运行:

    140609378646728
    旺财
    140609378646728
    旺财
    

    相关文章

      网友评论

          本文标题:2018-10-08 Python20 __方法__、单例模式

          本文链接:https://www.haomeiwen.com/subject/kakjaftx.html