潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)
1,new方法:
类每次实例化时都会创建一个新的对象,
class Textcls:
# cls 是指类本身,
def __new__(cls, *args, **kwargs): # 在 __init__ 前触发,
if not hasattr( cls,'inst' ): # 判断是否有 inst 的属性
cls.inst = super().__new__(cls) # 调用 __new__ 方法,为当前类创建空间
# 如果没有 创建属性给实例,此时 属性= c1 return cls.inst
# 如果有 返回 c1, 此时 c1 = c2 def __init__(self):
print('') c1 = Textcls() # 第一次实例 c1,
c2 = Textcls() # 第二次实例 c1 给c2
print(id(c1), id(c2))
# 创建两个实例 ,内存地址一样,所以两个实例拿完相同,
# 目的为了文件打开保存是一一的,
2, 定制属性访问 (自醒) 反射
hasattr( cls,'inst' ) 判断类 cls 中有没有 inst 的属性 存在返回 真
delattr ( cls,'inst' ) 删除类 cls 中的 inst 属性
gelattr ( cls,'inst' ) 获取类 cls 中的 inst 值,相当于:cls .inst
selattr ( cls,'inst','已经存在?' ) 如果 inst 在类 cls 中已经存在,则会用 “已经存在?”这个值覆盖原 inst 的值 ,
如果不存在,则添加这个属性
__getattr__(): 的使用,
class Textcls:
def __getattr__(self, item):
print('你调用的属性不存在,') c = Textcls()
getattr(c,'a') ## ------》》》 你调用的属性不存在,
如果一个不存在的属性被调用,则会触发 __getattr__(): 的方法
3,描述符
class MyAttribute:
def __get__(self, instance, owner):
print("get") def __set__(self, instance, value):
print('set') def __delete__(self, instance):
print("delete") def __del__(self):
print('del') class MyClass:
m = MyAttribute() # 用实例做属性
def __del__(self):
print('del MyClass') c = MyClass()
c.m # 调用属性,如果属性是个实例,会触发 __get__方法
# 一个实例调用另一个实例, c.m = 123 # 修改实例属性时,果属性是个实例, 会触发 __set__
del c.m # 修改实例属性时,会触发 __set__
4,装饰器
def f1(f):
print('f1')
def f2():
print('f2')
return f2 def f():
print('f') f1(f)() ## f1(f)() 相当于
# a = f()
# f1(a)
f1() 返回 f2,这时 f1() 可以做另一个函数的 装饰def f1(f):
print('f1')
def f2():
print('f2')
return f2
@ f1 # 语法糖,如果后面是韩式,会直接调用这个函数,
def f():
print('f')
f() # 运行该函数时,相当于把这个函数当成参数传进 f1() 中运行,
# 再把返回的 闭包加 () 运行,
内置装饰器:
@property
class Re():
@property # 调用该方法时不会传入 self
def test1(self):
print('a')
def test2(self):
print('b')
m = Re()
m.test1
m.test2()
@ classmethod
class Tacls():
def f1(self):
print(self)
@ classmethod # 会自动传入 类本身,
def f2(cls):
cls().f1()
print('方法 f2')
m = Tacls()
m.f1()
m.f2()
@staticmethod
class Re():
@staticmethod # 调用该方法时不会传入 self
def test1(self):
print('a')
def test2(self):
print('b')
m = Re()
m.test1(self=)
潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)的更多相关文章
- NeHe OpenGL教程 第三十二课:拾取游戏
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Kali Linux Web 渗透测试— 第十二课-websploit
Kali Linux Web 渗透测试— 第十二课-websploit 文/玄魂 目录 Kali Linux Web 渗透测试— 第十二课-websploit..................... ...
- NeHe OpenGL教程 第四十二课:多重视口
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第二十二课:凹凸映射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第十二课:显示列表
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
- “全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)
类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...
- 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)
index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...
随机推荐
- Django 查询集简述
通过模型中的管理器构造一个查询集(QuerySet),来从数据库中获取对象.查询集表示从数据库中取出来的对象的集合.它可以含有零个.一个或者多个过滤器.过滤器基于所给的参数限制查询的结果. 从SQL ...
- ARMV8 datasheet学习笔记1:预备知识
1. 前言 ARMv8的架构继承以往ARMv7与之前处理器技术的基础; 除了支持现有的16/32bit的Thumb2指令外,也向前兼容现有的A32(ARM 32bit)指令集. 基于64bit的AAr ...
- zabbix系列(九)zabbix3.0实现自动触发zabbix-agent端shell脚本任务
zabbix实现自动触发远程脚本执行命令 Zabbix触发器(trigger)达到阀值后会有动作(action)执行:发送告警信息或执行远程命令 环境 Server:基于centos6.5 final ...
- 编译安装lamp环境
httpd 2.4.9 + mysql-5.5.33 + php-5.4.29编译安装过程: 准备好以下安装包: mysql-5.5.33-linux2.6-x86_64.tar.gz apr-uti ...
- JS的浅拷贝与深拷贝
浅拷贝 //这样的拷贝有一个问题.那就是,如果父对象的属性等于数组或另一个对象,//那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能. function exten ...
- web前端开发分享-css,js提高篇
一. css基础知识掌握之后(个人的标准是:弄清块元素与内联元素的区别,弄清float的应用场景,弄清position[pə'zɪʃən] 下五个属性static['stætɪk],relative[ ...
- Inno Setup 系列之先卸载之后再安装
需求使用Inno Setup打包程序之后,很多时候我们需要在安装文件之前卸载原有的程序而不是覆盖安装,本文的Code就是实现了这样的功能.如果想要在安装前先卸载,那么需要加下面代码,需要注意的是双星号 ...
- ORA-01427: 单行子查询返回多个行
有人问题我一个问题,情况如下:他要用根据divide_act_channel_day的new_amount字段去更新divide_stat的new_amount字段.两张表关联的条件:day=log_ ...
- Linux && 与 ||
一.&& && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2' || 表示上一条命令执行失败后,才执行下一条 ...
- PhpStorm 中切换PHP版本
PhpStorm 中默认的 PHP 版本是 PHP 5.4 ,PhpStorm 会以该版本对编辑器中的PHP文件进行自动校验.EX:PHP文件中,使用了 PHP 5.4 版本以上的新特性,由于 Php ...