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让我们将自定义的代码同变量的访问/设定联 ...
随机推荐
- How To Determine The Cause Of Lots Of Redo Generation Using LogMiner (Doc ID 300395.1)
How To Determine The Cause Of Lots Of Redo Generation Using LogMiner (Doc ID 300395.1) APPLIES TO: O ...
- oracle数据库自动生成数据库表结构文档(亲测有效)
import java.awt.Color; import java.io.FileOutputStream; import java.sql.Connection; import java.sql. ...
- webpack打包 The 'mode' option has not been set, webpack will fallback to
webpack 打包报错 The 'mode' option has not been set, webpack will fallback to 'production' for,Module no ...
- Tornado(1)
概述 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了 ...
- Python学习记录:括号配对检测问题
Python学习记录:括号配对检测问题 一.问题描述 在练习Python程序题的时候,我遇到了括号配对检测问题. 问题描述:提示用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确, ...
- 构建LVS负载均衡集群——NAT模式(最简单方式)
一.装备一台lvs调度器主机要求两个网卡一个为内部局域网ip,一个为公网ip #IP地址设置过程不再重复 [root@localhost ~]# ip a | grep eth0 #内网ip : et ...
- 基于socketserver实现并发的socket编程
目录 一.基于TCP协议 1.1 server类 1.2 request类 1.3 继承关系 1.4 服务端 1.5 客户端 1.6 客户端1 二.基于UDP协议 2.1 服务端 2.2 客户端 2. ...
- Java连载51-super关键字
一.super关键字 我们先看一个例子 package com.bjpowernode.java_learning; public class D51_ { public static void ...
- js实现addClass方法,classList与className有什么区别?
壹 ❀ 引 Jquery中addClass与removeClass是两个使用高频的方法,对于为dom元素增删class类非常方便:但如果不用JQ,使用js怎么模拟它们呢?本文主要记录下自己的实现思路 ...
- 10-scrapy框架介绍
Scrapy 入门教程 Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通 ...