zoukankan      html  css  js  c++  java
  • python__基础 : 类的__new__方法与实现一个单例


    __new__ : 这个方法的作用主要是创建一个实例,在创建实例时首先会调用 __new__方法 ,然后调用__init__对实例进行初始化,

    如果想修改 __new__ 这个方法,那么最后要 return 调用一下父类的 __new__ 方法,因为里面有创建实例的过程,除非你在自定义的 __new__ 方法中自己实现了创建实例的过程:

    class Test(object):
        def __new__(cls, *args, **kwargs):  # 第一个参数传进去的是当前类   如果创建实例需要参数,那么需要加 *参数 和 **参数 ,否则异常
            print('将要创建一个类')
            return object.__new__(cls)
    
    a = Test()
    
    >>>将要创建一个类

    单例 : 所谓单例,就是无论创建多少个实例,他都只是在第一次创建的时候真正创建,以后再次创建都返回第一次创建的实例 :

    class Singleton(object):
        __instance = None # 控制实例
        __first_init = False # 控制初始化实例属性
    
        def __new__(cls, *args, **kwargs):
            # 如果实例为空,创建它
            if not cls.__instance:
                cls.__instance = object.__new__(cls)
            # 否则只是反回第一次创建的实例
            return cls.__instance
    
        def __init__(self, age, name):
            # 如果__first__init 为Flase,初始化实例属性 ,可以控制实例属性只被初始化一次
            if not Singleton.__first_init:
                self.age = age
                self.name = name
                Singleton.__first_init = True
    
    a = Singleton(18, 'dog')
    b = Singleton(19, 'cat')
    print(a)
    print(b)
    print(a.age,a.name)
    print(b.age,b.name)

    >>>  <__main__.Singleton object at 0x054A21D0>
       <__main__.Singleton object at 0x054A21D0>
       18 dog
       18 dog

    
    

    可以看出,后来创建的都是返回第一次创建的那个实例,而且实例属性只能被初始化一次.

  • 相关阅读:
    HTML5结构
    HTML5新增的非主体元素header元素、footer元素、hgroup元素、adress元素
    CF GYM 100703G Game of numbers
    CF GYM 100703I Endeavor for perfection
    CF GYM 100703K Word order
    CF GYM 100703L Many questions
    CF GYM 100703M It's complicate
    HDU 5313 Bipartite Graph
    CF 560e Gerald and Giant Chess
    POJ 2479 Maximum sum
  • 原文地址:https://www.cnblogs.com/cccy0/p/9048325.html
Copyright © 2011-2022 走看看