1,new方法:

  类每次实例化时都会创建一个新的对象,

  1. class Textcls:
  2. # cls 是指类本身,
  3. def __new__(cls, *args, **kwargs): # 在 __init__ 前触发,
  4. if not hasattr( cls,'inst' ): # 判断是否有 inst 的属性
  5. cls.inst = super().__new__(cls) # 调用 __new__ 方法,为当前类创建空间
  6. # 如果没有 创建属性给实例,此时 属性= c1
  7.  
  8. return cls.inst
  9. # 如果有 返回 c1, 此时 c1 = c2
  10.  
  11. def __init__(self):
  12. print('')
  13.  
  14. c1 = Textcls()   # 第一次实例 c1,   
  15. c2 = Textcls()   # 第二次实例 c1 给c2
  16. print(id(c1), id(c2))
  17. # 创建两个实例 ,内存地址一样,所以两个实例拿完相同,
  18. # 目的为了文件打开保存是一一的,

  

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__():  的使用,

  1. class Textcls:
  2. def __getattr__(self, item):
  3. print('你调用的属性不存在,')
  4.  
  5. c = Textcls()
  6. getattr(c,'a')
  7.  
  8. ## ------》》》 你调用的属性不存在,

  如果一个不存在的属性被调用,则会触发 __getattr__(): 的方法

3,描述符

  1. class MyAttribute:
  2. def __get__(self, instance, owner):
  3. print("get")
  4.  
  5. def __set__(self, instance, value):
  6. print('set')
  7.  
  8. def __delete__(self, instance):
  9. print("delete")
  10.  
  11. def __del__(self):
  12. print('del')
  13.  
  14. class MyClass:
  15. m = MyAttribute() # 用实例做属性
  16. def __del__(self):
  17. print('del MyClass')
  18.  
  19. c = MyClass()
  20. c.m # 调用属性,如果属性是个实例,会触发 __get__方法
  21. # 一个实例调用另一个实例,
  22.  
  23. c.m = 123 # 修改实例属性时,果属性是个实例, 会触发 __set__
  24. del c.m # 修改实例属性时,会触发 __set__

  

4,装饰器

  1. def f1(f):
  2. print('f1')
  3. def f2():
  4. print('f2')
  5. return f2
  6.  
  7. def f():
  8. print('f')
  9.  
  10. f1(f)()
  11.  
  12. ## f1(f)() 相当于
  13. # a = f()
  14. # f1(a)

f1()  返回 f2,这时 f1() 可以做另一个函数的 装饰def f1(f):

  1. print('f1')
  2. def f2():
  3. print('f2')
  4. return f2
  5. @ f1    # 语法糖,如果后面是韩式,会直接调用这个函数,
  6. def f():
  7. print('f')
  8. f() # 运行该函数时,相当于把这个函数当成参数传进 f1() 中运行,
      
    #  再把返回的 闭包加 () 运行,

  

  内置装饰器:

   @property

  1. class Re():
  2.  
  3. @property # 调用该方法时不会传入 self
  4. def test1(self):
  5. print('a')
  6.  
  7. def test2(self):
  8. print('b')
  9.  
  10. m = Re()
  11. m.test1
  12. m.test2()
  1. @ classmethod
  1. class Tacls():
  2.  
  3. def f1(self):
  4. print(self)
  5.  
  6. @ classmethod # 会自动传入 类本身,
  7. def f2(cls):
  8. cls().f1()
  9. print('方法 f2')
  10.  
  11. m = Tacls()
  12. m.f1()
  13. m.f2()

  

  1. @staticmethod
  1. class Re():
  2.  
  3. @staticmethod # 调用该方法时不会传入 self
  4. def test1(self):
  5. print('a')
  6.  
  7. def test2(self):
  8. print('b')
  9.  
  10. m = Re()
  11. m.test1(self=)

  

潭州课堂25班:Ph201805201 第十二课 new方法,定制属性访问,描述符与装饰器 (课堂笔记)的更多相关文章

  1. NeHe OpenGL教程 第三十二课:拾取游戏

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  2. Kali Linux Web 渗透测试— 第十二课-websploit

    Kali Linux Web 渗透测试— 第十二课-websploit 文/玄魂 目录 Kali Linux Web 渗透测试— 第十二课-websploit..................... ...

  3. NeHe OpenGL教程 第四十二课:多重视口

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第二十二课:凹凸映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第十二课:显示列表

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字

    python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...

  7. “全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. 潭州课堂25班:Ph201805201 第十课 类的定义,属性和方法 (课堂笔记)

    类的定义 共同属性,特征,方法者,可分为一类,并以名命之 class Abc: # class 定义类, 后面接类名 ( 规则 首字母大写 ) cls_name = '这个类的名字是Abc' # 在类 ...

  9. 潭州课堂25班:Ph201805201 WEB 之 页面编写 第四课 登录注册 (课堂笔记)

    index.html 首页 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...

随机推荐

  1. emmc基础技术8:操作模式4-data transfer mode

    1.前言 eMMC总线操作包含: boot mode, device identification mode interrupt mode data transfer mode 本文主要描述data ...

  2. 使用neo4j-import工具导入数据

    从Neo4j2.2版本开始,系统就自带了一个大数据量的导入工具:neo4j-import,可支持并行.可扩展的大规模csv数据导入(本例版本为:3.4.7版本) 1.前提条件 关闭neo4j 无法在原 ...

  3. jenkins jar包上传maven仓库

    1      Jenkins 编译后部署至 Maven 仓库 jenkins编译后构件(如:jar包)部署至maven仓库需修改以下内容:maven 仓库配置:项目 pom 文件:本地仓库的 sett ...

  4. centos命令行变成了-bash-4.1$的解决办法

    在使用root用户是先建立了用户yunva的家目录,然后添加yunva用户,切换到yunva用户后发现 命令行变成了-bash-4.1$ ①方法一(临时生效,不推荐) 1. bashrc 在当前目录下 ...

  5. 队列queue 代码

    import queue q=queue.Queue(3) #队列:先进先出 q.put(1) q.put(2) q.put(3) q.put(4) print(q.get()) print(q.ge ...

  6. 将日期或数据转换为char数据类型 TO_CHAR(x[[,c2],C3])

    TO_CHAR(x[[,c2],C3])[功能]将日期或数据转换为char数据类型[参数]x是一个date或number数据类型.c2为格式参数c3为NLS设置参数如果x为日期nlsparm=NLS_ ...

  7. keras2.0的一些变化

    keras 变化太快了https://github.com/fchollet/keras/wiki/Keras-2.0-release-notes

  8. python 全栈开发,Day128(创建二维码,扫码,创建玩具的基本属性)

    昨日内容回顾 1.app播放音乐 plus.audio.createPlayer(文件路径/URL) player.play() 播放音乐 player.pause() 暂停播放 player.res ...

  9. 浅析C语言的变量

    参考资料 寄存器变量 用register声明的变量是寄存器变量,是存放在CPU的寄存器里的.而我们平时声明的变量是存放在内存中的.虽说内存的速度已经很快了,不过跟寄存器比起来还是差得远. 寄存器变量和 ...

  10. Ckeditor一种很方便的文本编辑器

    ckeditor官网:http://ckeditor.com/ 这里介绍ckeditor的其中一个的用法,自己做小项目练手非常的适合,上手非常的快. 首先去官网下载这个东西,链接:http://pan ...