zoukankan      html  css  js  c++  java
  • day30 __new__ 以及单例模式

    __new__ 
     1 # __new__
     2 # object.__new__()
     3 
     4 class A :
     5     def __init__(self):
     6         self.x = 1
     7         print("init执行啦")
     8     def __new__(cls, *args, **kwargs):
     9         print("new执行啦")
    10         return object.__new__(A,*args,**kwargs)     # __new__ 是不能自己创建对象的,因此他只能用object类中的__new__来创建一个实例化
    11 
    12 a = A()
    13 # 执行结果:
    14     # new执行啦        # 先执行的是 new
    15     # init执行啦
    16 
    17 # new 是比 init 还要现执行。
    18 # new的参数是cls 不是 self,
    19 # init 创建self,但是new 比self 还要先执行,因此new执行的时候没有self,只有cls
    20 # cls 表示上一层,即这个类本身
    21 # __new__ 是不能自己创建对象的,因此他只能用object类中的__new__来创建一个实例化

    设计模式 23种
    单例模式 一个类始终只有一个实例
    当你第一次实例化这个类的时候就创建一个实例化对象
    当你之后实例化的时候就用之前的创建的对象,相当于所有的操作对象就那一个

     1 class A :
     2     __instance = False                   # 定义一个私有的变量,只能内部的去拿
     3     def __init__(self,name,age):
     4         self.name = name
     5         self.age = age
     6     def __new__(cls, *args, **kwargs):
     7         if cls.__instance:                # 第一次循环外部拿不到自然就是 Fales
     8             return cls.__instance
     9         else:cls.__instance = object.__new__(A)   # 借助object类创建的实例并赋值
    10         # 第一次创建的变量一定是fales的
    11         # 返回一个借助object类创建的实例并赋值,
    12             # 所创建的这个实例是什么都没有的,没有self的属性,只是开辟了一段空的内存地址给他用
    13             # 之后在调用init 根据你的参数赋值属性添加内存
    14         # __instance是保存在类里面的静态变量
    15         # 以后每次进来都是使用cls.__instance 作为实例了
    16         return cls.__instance               # 返回一个全局的变量
    17 suyang = A("sbb",2)
    18 suyang.cloth = "none"
    19 sb = A("suyang",2)    # 在创建示例会覆盖之前的实例的属性,但是两个示例都是存在的
    20 print(sb)             # <__main__.A object at 0x000000000255D208>
    21 print(suyang)         # <__main__.A object at 0x000000000255D208>
    22 print(suyang.name)    # suyang
    23 print(sb.name)        # suyang      # name 和age 都会被下一次实例化的时候被新值锁覆盖
    24 print(suyang.cloth)   # none        # 尽管使用一个内存地址但是cloth 的属性没有被覆盖,而且保存在地址里面也不会被清除
    25 print(sb.cloth)       # none        # sb示例并没有创建 cloth 属性,但是依然可以调用出来之前 suyang 示例的属性 ,即继承了之前的属性
    26 
    27 sb.hobby = "sb"
    28 print(suyang.hobby)   # sb          # 相同的没有创建 hobby 的 suyang 示例 也可以继承之后的 sb 创建的 hobby 属性
  • 相关阅读:
    margin+absolute布局:右栏固定主内容自适应 demo
    localForage——轻松实现 Web 离线存储
    迷你MVVM框架 avalonjs 1.2.6发布
    收起.NET程序的dll来
    从锅炉工到AI专家 ---- 系列教程
    DevExpress中实现GridControl的分页功能
    树莓派 ---- 个人总结
    树莓派安装内网穿透版花生壳服务
    winform 多线程中ShowDialog()模式窗口无效的解决办法
    局域网匿名访问共享文件
  • 原文地址:https://www.cnblogs.com/shijieli/p/9939298.html
Copyright © 2011-2022 走看看