首页 > 其他分享 >new方法、定制属性访问、描述符与装饰器知识点总结

new方法、定制属性访问、描述符与装饰器知识点总结

时间:2023-09-05 11:33:54浏览次数:28  
标签:__ 知识点 创建 instance 描述符 实例 new cls

一:__new__方法

思考:

  a. 我们创建实例是通过什么方法创建的呢?

  b. 类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?===通过单利模式实现    c.什么是单例模式(Singleton Pattern 

  1、确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,单例模式是一种对象创建型模式


 2、是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场

 3、如果instance是None,则创建对象并赋值给instance,如果instance等于之前创建的对象,则直接返回

例1:创建单例典范(保证只有一个对象,只执行一次init方法)
     问题:
类每次实例化的时候都会创建一个新的对象,如果要求类只能被实例化一次该怎么做呢?
a:用__new__方法实现单例模式可以当成一个范式记忆
b:节省空间
c:new 方法在实例化的时候最先被执行

步骤:
# 单例模式思路:
# 需要生成一个实例===》通过一个方法创建的===》通过object中的__new__方法生成的实例===>返回地址空间
# 以下写法a与a2就不再是独立的实例
# 每次实例的时候都会开辟一个新的空间
# a=A() # 通过object中的__new__方法生成的实例
# a2=A()

# 需求:这个类只能够我一个人使用怎么办?(这个实例实例化了就不能够再创建实例了)
# 只让__new__创建一个实例,重写====》加个条件===》super
# 条件:第一次实例的时候、保存第一次创建的实例 (创建并保存)
# 不是第一次实例的时候:返回第一次创建的实例地址

 

class A(object):
    instance = None  # 这个属性要在方法外面
    
    def __init__(self): # 这个方法可以不写,直接写属性就行
      
        name='aa'
    # cls==》当前类 A
    # 初始化在__new__方法之后
    def __new__(cls, *args, **kwargs): # 重写object类中的new方法

        # hasattr(cls,'instance')为True,加个not就是False语句
        # if not hasattr(cls,'instance'):  #  instance是一个随便写的属性
        if not cls.instance:
            # 创建一个实例并把实例地址空间保存到cls.instance中
            cls.instance=super().__new__(cls)  # new方法来自与object类
            # A.instance = super().__new__(A)  # cls==A
        # else:
        # 不满足就返回
        return cls.instance  # cls.instance为第一次创建的地址空间

a=A()
a.name='小米'
print(a.name)
# 当第二次创建实例直接返回地址空间==》cls.instance
a2=A()
print(a2.name)
print(id(a))
print(id(a2))

运行截图:

 延伸:hasattr 方法

class A(object):
    name='小明'

a=A()
# hasattr这个方法是查找有没有这个属性返回bool值,前面放得是类名或者实例,后面是属性变量
print(hasattr(a,'name')) # True
print(hasattr(a,'name1')) # False

运行截图:

 

 



























标签:__,知识点,创建,instance,描述符,实例,new,cls
From: https://www.cnblogs.com/xiaogan-520/p/17679196.html

相关文章

  • SpringCloud知识点整理
         ......
  • 467B - Fedor and New Game
    B.FedorandNewGamehttps://codeforces.com/problemset/problem/467/B"""思路:1.暴力方法:通过循环二进制之后的,逐个位与fedor进行判断,通过取余,如果最后不同的超过3个就计+12.解决方法:通过异或^进行判断,然后转成二进制,统计1的数量,就是不同的数量,然后相加"""#利用异或......
  • [ 总结 ] Linux 下文件描述符
    1、概述:文件描述符是内核为了高效管理已被打开的文件所创建的索引。是一个非负整数,用于代指被打开的文件。所有通过I/O操作的系统调用都通过文件描述符。文件描述符用以表明每一个被进程所打开的文件和socket 2、文件描述符的限制:Linux下最大文件描述符的限制......
  • 排序算法知识点和常见面试题
    查找和排序算法知识点和常见面试题查找二分查找排序算法知识点冒泡排序插入排序选择排序快速排序二分思维+递归思维#include<stdio.h>intFindPos(int*a,intlow,inthigh);voidQuickSort(int*a,intlow,inthigh);intmain(void){ inta[6]={-2,1,......
  • 关于使用new Integer还是Integer.valueOf的研究
    作者:fbysss前言:最近看到这样的说法:使用Integer.valueOf代替newInteger更有效率,原因是研究了Integer源码,发现有一个缓存可以利用。对此我也一探究竟。发现这其实与Java的自动装箱拆箱有关,直接使用Integeri=数值的方式即可。通过字节码研究是比较有效的方式。那我们来看看吧:-----......
  • 每个.NET开发都应掌握的C#集合知识点
    上篇文章讲述了C#委托和事件知识点,本文将介绍C#集合知识点。作为.NET开发人员,C#集合是你在构建强大和高效应用程序时的关键技能之一。C#集合提供了一系列丰富的数据结构,可以帮助你更好地管理、操作和组织数据。本文将介绍一些每个.NET开发人员都应该掌握的C#集合知识点。1、灵活......
  • 平台工程动态 Monthly News 2023-8
    了解最新行业动态,洞察平台工程本质。平台工程月度动态2023-8   注:您所阅读的内容来自平台工程社区基于网络公开资料整理推荐,如您希望自己的内容也出现在月度动态,欢迎一起参与,详见文末。本期内容预览:新闻速递|中国信通院发布铸基计划TISC企业级平台工程综合能力要......
  • 文件描述符限制,macos和linux
    macOS和Linux在文件描述符限制上存在不同的默认设置,这就是为什么您看到在相同的代码在两个操作系统上显示不同的数字。让我们来解释一下原因:macOS(BSD-like系统):默认情况下,macOS(以及其他基于BSD的操作系统)限制每个进程可以同时打开的文件描述符数量为256。这个限制是macOS......
  • What's the best approach for generating a new API key?
    https://stackoverflow.com/questions/14412132/whats-the-best-approach-for-generating-a-new-api-keyEdit:I'vespoketoafewfriends(email/twitter)andtheyrecommendedjustusingaGUIDwiththedashesstripped.......
  • 泛微E-cology ifNewsCheckOutByCurrentUser.dwr SQL注入漏洞
    漏洞描述泛微E-cology的ifNewsCheckOutByCurrentUser.dwr文件存在SQL注入漏洞。漏洞复现fofa语法:app="泛微-协同办公OA"登录页面如下:POC:POST/dwr/call/plaincall/CptDwrUtil.ifNewsCheckOutByCurrentUser.dwrHTTP/1.1Host:User-Agent:Mozilla/5.0(WindowsNT5.1)A......