Python__new__方法、定制属性访问、描述符与装饰器
- __new__方法的运行顺序
- 装饰器的概念的用法
- 三个内置装饰器
- 类中属性的访问过程
__new__方法
创建实例的方法
__new__方法是在类创建实例的时候自动调用的
实例是通过类里面的__new__方法创建出来的


先调用__new__方法创建实例,再调用 __init__方法初始化实例
__new__方法,后面括号里的cls代表的是类本身
必须有返回值 父类名.__new__(cls)
单例模式


创建多个实例的时候,每个实例所指向的内存地址不同
单例模式让多个实例引用的是同一个实例,是一个实例的不同名字,指向同一内存地址


定制属性访问
就是对类里的属性进行增删改查的操作
增
实例名.属性名=值
setattr(实例名, '属性名', 值) # 有这个属性就修改,没有就增加
实例名.__setattr__('属性名',值) # 有这个属性就修改,没有就增加


删
只能删除自己添加的属性
delattr(实例名, '属性名')
实例名.__delattr__('属性名')
del 实例名


改
setattr(实例名, '属性名', 值) # 有这个属性就修改,没有就增加
实例名.__setattr__('属性名',值) # 有这个属性就修改,没有就增加
查
hasattr(实例名, '属性名') 返回bool值
getattr(实例名, '属性名') 返回属性值,不存在则报错
实例名. __getattribute__('属性名') 返回属性值,不存在则报错


描述符
比较抽象的一个概念,了解即可
描述符协议:python描述符是一个“绑定行为”的对象属性,在描述符协议中,它可以通过方法重写属性的访问
这些方法有 __get__(), __set__(), 和__delete__()
如果这些方法中的任何一个被定义在一个对象中,这个对象就是一个描述符


装饰器
本质是函数,能够实现在不修改原来的函数的基础上添加功能
在闭包的前提下进行装饰


三个内置装饰器
@property # 就像和访问属性一样


@staticmethod # 静态方法,与class类断开连接


@classmethod # 类方法 cls代表类本身


类装饰器
类也可以做装饰器,但是需要定义 __call__ 方法


Python__new__方法、定制属性访问、描述符与装饰器的更多相关文章
- Python:高级主题之(属性取值和赋值过程、属性描述符、装饰器)
Python:高级主题之(属性取值和赋值过程.属性描述符.装饰器) 背景 学习了Javascript才知道原来属性的取值和赋值操作访问的“位置”可能不同.还有词法作用域这个东西,这也是我学习任何一门语 ...
- 潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)
1,new方法: 类每次实例化时都会创建一个新的对象, class Textcls: # cls 是指类本身, def __new__(cls, *args, **kwargs): # 在 __ini ...
- python基础学习之描述符和装饰器
描述符的了解: 描述符协议: python描述符是一个"绑定行为"的对象属性,在描述符协议中,它可以通过方法重写属性的访问.这些方法有: __get__, __set__, 和__ ...
- ES6新增对象方法的访问描述符:get(只读)、set(只写)
Es6新增对象方法的访问描述符:get(只读).set(只写),可以直接使用,一般用于数据监听,用途类似于vue.$watch. var obj = { a:1, get bar() { return ...
- Python笔记(4)类__属性与描述符
部分参考自:http://www.geekfan.net/7862/ 新式类与经典类 2和3不一样,3都是新式类. 新式类和经典类的区别: class A: #classic class " ...
- ie8 报错:意外地调用了方法或属性访问
在某场景中一句简单的js: $("#changeOption").text("增加"); 在 IE8 下面报错:'意外地调用了方法或属性访问' 改成:$(&qu ...
- 【python】闭包、@修饰符(装饰器)、
闭包:(返回函数的行为叫闭包??) #函数也是对象,所以可以被传递 def line_conf(a,b): def line(x): return a*x+b return line line1=li ...
- Python 函数修饰符(装饰器)的使用
Python 函数修饰符(装饰器)的使用 1. 修饰符的来源修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等. 修饰符是解决这类问题的绝佳设计, ...
- 如何正确地使用Python的属性和描述符
关于@property装饰器 在Python中我们使用@property装饰器来把对函数的调用伪装成对属性的访问. 那么为什么要这样做呢?因为@property让我们将自定义的代码同变量的访问/设定联 ...
随机推荐
- This app has crashed because it attempted to access privacy-sensitive data without a usage description. The app's Info.plist must contain an NSPhotoLibraryAddUsageDescription key with a string value
iOS10 11之后遇到这种报错的小伙伴们请注意啦: 你会发现网上一大堆博客和论坛都是让你在 Info.plist 里面要涉及隐私数据时要添加一句“提示语”.于是打开 Info.plist,点击 + ...
- Android Gradle 学习笔记(二):Gradle Wrapper
Wrapper,就是对Gradle的一层包装,便于在团队开发过程中统一Gradle构建的版本.这样大家就可以使用统一的Gradle版本进行构建,避免因为Gradle的版本不统一带来的不必要的问题. 这 ...
- Django2.1.1与xadmin0.6.0遇到的坑(一)
(1)django2.0把from django.core.urlresolvers修改成了django.urls 异常信息: ModuleNotFoundError: No module named ...
- Linux部署NFS服务共享文件
NFS(网络文件系统)用于linux共享文件 第1步:配置所需要的环境 使用两台Linux主机 主机名称 操作系统 IP地址 NFS Centos7 192.168.218.139 NFSa Cent ...
- [apue] syslog 导致 accept 出错?
前几天在看apue第16章关于socket的例子,就是一个非常典型的socket服务器,关键代码如下: void serve (int sockfd) { int ret; int clfd; int ...
- c/c++概述
c/c++的学习分为两个部分 一.语言标准 语言标准定义了功能特性和标准库两部分. 功能特性由编译器负责具体实现,比如linux下gcc,windows下Visual Studio 标准库实现依赖于具 ...
- windows下配置ngnix服务器经常出现503问题解决办法
自己网站在windows server2008下安装的ngnix,然后配置php,网站访问流量并不大,但是经常出现503问题.经过查看ngnix服务器错误日志,发现: (10061: No conne ...
- 【转】bootstrap table轻松实现数据表格
在使用bootstrap table时可能在很多时候回用的表格来显示数据,如果自己写那肯定没问题,但是数据展示出来就麻烦多了,然而bootstrap table 封装了一套完善的数据表格组件,把从后台 ...
- Ant默认配置文件不是build.xml该如何编写命令进行编译打包
Ant的构件文件是基于XML编写的,默认名称为build.xml. ant命令默认寻找build.xml文件.若文件名为hello.xml时,读者还需要对命令做少许改变, 改为:ant –f hell ...
- JS做的类似腾讯专题图片播放器,大家可以一起来改进!
我是一个应届生,来公司不久,根据需求,网站需要一个专题图片轮播的页面.网上确实有很多现成的插件,但是,作为一个JS还不是很牛的应届生,我决定自己写一个! 话说忽然想到做个这个还真不容易,一时思绪理不清 ...