1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # ------------------------------------------------------------
  4. #
  5. # 参考资料:(未有转载)
  6. # 面向对象进阶 - linhaifeng - 博客园
  7. # https://www.cnblogs.com/linhaifeng/articles/6204014.html#_label12
  8. #
  9. # python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块) - 心大一点 - 博客园
  10. # http://www.cnblogs.com/yangjian1/p/6172174.html
  11. #
  12. # python基础之迭代器协议和生成器(一) - devops1992 - 博客园
  13. # https://www.cnblogs.com/bingabcd/p/6691730.html
  14. #
  15. # ------------------------------------------------------------
  16. # ******************** day27-面向对象进阶 *******************
  17. # ******************** day27-面向对象进阶 *******************
  18. # =====>>>>>>内容概览
  19. # =====>>>>>>内容概览
  20. # day27_MianXiangDuiXiangJinJie
  21.  
  22. # ------------------------------------------------------------
  23. # # 1、argv
  24. # # # 在命令行参数是一个空列表,在其他中第一个列表元素中程序本身的路径
  25. # # # 通过命令终端来运行下面的程序,在pycharm中,编译器会自动处理,因此会报错
  26. # ------------------------------------------------------------
  27.  
  28. # ------------------------------------------------------------
  29. # # 2、sys.path
  30. # # # 返回模块的搜索路径,初始化时使用python PATH环境变量的值
  31. # ------------------------------------------------------------
  32.  
  33. # ------------------------------------------------------------
  34. # # 3、getcwd、chdir、r字符串
  35. # # # getcwd 获取当前的文件路径
  36. # # # chdir 更改文件路径
  37. # # # r字符串 正则表达式r的作用,让"D:\Program Files (x86)"的“\”不再具备有特殊意义
  38. # # # 即“\\” == r“\”
  39. # ------------------------------------------------------------
  40.  
  41. # ------------------------------------------------------------
  42. # # 4、路径拼接,os.path.join
  43. # ------------------------------------------------------------
  44.  
  45. # ------------------------------------------------------------
  46. # # 4.1、路径拼接2, os.path.join
  47. # ------------------------------------------------------------
  48.  
  49. # ------------------------------------------------------------
  50. # # 5、判断该运行文件中是否有该属性x
  51. # # # day27_MianXiangDuiXiangJinJie 是当前的文件运行名称
  52. # ------------------------------------------------------------
  53.  
  54. # ------------------------------------------------------------
  55. # # 5.1、判断该运行文件中是否有该属性2
  56. # # # 解决序列5的问题
  57. # # # __name__ 当前的运行文件
  58. # # # sys.modules 储存挡墙的运行文件的模块名称列表
  59. # ------------------------------------------------------------
  60.  
  61. # ------------------------------------------------------------
  62. # # 6、__setattr__,__delattr__,__getattr__的应用对象
  63. # # # 这三者的应用对象是类的“实例”;类本身并不会被影响到
  64. # ------------------------------------------------------------
  65.  
  66. # ------------------------------------------------------------
  67. # # 7、isinstance
  68. # # # isinstance(obj,cls)检查是否obj是否是类 cls 的对象
  69. # ------------------------------------------------------------
  70.  
  71. # ------------------------------------------------------------
  72. # # 8、issubclass
  73. # # # issubclass(sub, super)检查sub类是否是 super 类的派生类
  74. # ------------------------------------------------------------
  75.  
  76. # ------------------------------------------------------------
  77. # # 9、getattribute
  78. # # # 只要与实例相关的都会触发该操作
  79. # # # getattribute的优先级别高于getattr
  80. # ------------------------------------------------------------
  81.  
  82. # ------------------------------------------------------------
  83. # # 9.1、getattribute被屏蔽时,getattr的情况
  84. # # # 只要与实例相关的都会触发该操作
  85. # # # getattribute的优先级别高于 getattr
  86. # ------------------------------------------------------------
  87.  
  88. # ------------------------------------------------------------
  89. # # 10、AttributeError
  90. # # # 自定义的抛出异常
  91. # ------------------------------------------------------------
  92.  
  93. # ------------------------------------------------------------
  94. # # 11.1、 __getattr__的作用
  95. # # # 属性不存在的时候会触发 __getattr__
  96. # # # 类是不会触发 __getattr__
  97. # ------------------------------------------------------------
  98.  
  99. # ------------------------------------------------------------
  100. # # 11.2、 只有__getattribute__存在的情况,没有写入raise AttributeError
  101. # ------------------------------------------------------------
  102.  
  103. # ------------------------------------------------------------
  104. # # 11.3、 __getattribute__与__getattr__ ,没有raise
  105. # # # 没有raise是不会触发__getattr__;
  106. # ------------------------------------------------------------
  107.  
  108. # ------------------------------------------------------------
  109. # # 11.4、 __getattribute__与__getattr__与raise
  110. # # # 有了raise之后,无论属性有没有都会执行,raise AttributeError,
  111. # # # 之后,就会直接触发__getattr__;
  112. # ------------------------------------------------------------
  113.  
  114. # ------------------------------------------------------------
  115. # # 12、 __getattribute__与__getattr__总结
  116. # ------------------------------------------------------------
  117.  
  118. # ------------------------------------------------------------
  119. # # 13、__setitem__设置属性,
  120. # # # f1["age"] = 18 这种方式才回触发__setitem__
  121. # # # __setitem__操作的是[], 注意与前面的__setattr__区别
  122. # ------------------------------------------------------------
  123.  
  124. # ------------------------------------------------------------
  125. # # 14、__delitem__
  126. # # # del f1['age'] 这种方式才会触发 __delitem__
  127. # # # __setitem__操作的是[], 注意与前面的__delattr__区别
  128. # ------------------------------------------------------------
  129.  
  130. # ------------------------------------------------------------
  131. # # 15、__getitem__
  132. # # # f1["age"]这种方式才会触发 __getitem__
  133. # # # __getitem__[], 注意与前面的__getattr__区别
  134. # ------------------------------------------------------------
  135.  
  136. # ------------------------------------------------------------
  137. # # 16、__str__
  138. # # # 改变的是输出到窗口的信息, 与print(f2) ,print(file) 对比
  139. # # # str函数或者print函数--->obj.__str__()
  140. # ------------------------------------------------------------
  141.  
  142. # ------------------------------------------------------------
  143. # # 17、str(f1), f1.__str__()
  144. # # # str(f1)--->f1.__str__()
  145. # ------------------------------------------------------------
  146.  
  147. # ------------------------------------------------------------
  148. # # 17.1、str(f1), f1.__str__()
  149. # # # str(f1)--->f1.__str__()
  150. # ------------------------------------------------------------
  151.  
  152. # ------------------------------------------------------------
  153. # # 18、repr
  154. # # # repr 或者交互式解释器--->obj.__repr__()
  155. # ------------------------------------------------------------
  156.  
  157. # ------------------------------------------------------------
  158. # # 19、__str__ 与 __repr__
  159. # # # 两者同时出现时,输出打印选择的是__str__
  160. # ------------------------------------------------------------
  161.  
  162. # ------------------------------------------------------------
  163. # # 20、__str__与__repr__总结
  164. # # # str函数或者print函数--->obj.__str__()
  165. # # # repr或者交互式解释器--->obj.__repr__()
  166. # # # 如果__str__没有被定义,那么就会使用__repr__来代替输出
  167. # # # 两者同时出现时,输出打印选择的是__str__
  168. # # # 注意:这俩方法的返回值必须是字符串,否则抛出异常
  169. # ------------------------------------------------------------
  170.  
  171. # ------------------------------------------------------------
  172. # # 21、字符串.format
  173. # # #
  174. # ------------------------------------------------------------
  175.  
  176. # ------------------------------------------------------------
  177. # # 22、字符串.format的应用1
  178. # # #
  179. # ------------------------------------------------------------
  180.  
  181. # ------------------------------------------------------------
  182. # # 22.1、format 与类中 __format__ 的关系
  183. # # # 运行时,format 实际上就去调用“对应类”中的 __format__, __format__要有返回值
  184. # ------------------------------------------------------------
  185.  
  186. # ------------------------------------------------------------
  187. # # 23、format的应用 之 自定义格式
  188. # # # 自定义输出日期的格式, 与前面 序号21 对比;
  189. # # # 运行时,format 实际上就去调用“对应类”中的 __format__, __format__要有返回值
  190. # ------------------------------------------------------------
  191.  
  192. # ------------------------------------------------------------
  193. # # 24、__slots__介绍
  194. # # # 对于 __slots__ 我们关注的是,1、它的存在是为了节约内存; 2、它存在的类中,所有的
  195. # # # 属性“全部”都取消了实例字典,只有类字典; 3、__slots__ 定以后的变量,不可以在添加新的值,
  196. # # # 但是可以修改
  197. # ------------------------------------------------------------
  198.  
  199. # ------------------------------------------------------------
  200. # # 24.1、__slots__ 属性值添加
  201. # ------------------------------------------------------------
  202.  
  203. # ------------------------------------------------------------
  204. # # 24.2、__slots__ 属性值添加
  205. # ------------------------------------------------------------
  206.  
  207. # ------------------------------------------------------------
  208. # # 24.3、__slots__
  209. # ------------------------------------------------------------
  210.  
  211. # ------------------------------------------------------------
  212. # # 24.4、 __doc__
  213. # # # 该属性无法继承给子类; 如果没有对该属性进行赋值的话,那么默认是None
  214. # ------------------------------------------------------------
  215.  
  216. # ------------------------------------------------------------
  217. # # 25、 __module__ 与 __class__
  218. # # #
  219. # # # __module__ 表示当前操作的对象在那个模块
  220. # # # __class__ 表示当前操作的对象的类是什么
  221. # ------------------------------------------------------------
  222.  
  223. # ------------------------------------------------------------
  224. # # 26、__del__析构方法介绍
  225. # # #
  226. # # # 析构方法,当对象在内存中被释放时,自动触发执行。
  227. # # # 注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,
  228. # # # 如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,
  229. # # # 比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就
  230. # # # 用到了__del__
  231. # ------------------------------------------------------------
  232.  
  233. # ------------------------------------------------------------
  234. # # 27、__del__ 实例
  235. # # # 运行结束之后,就会触发 __del__
  236. # ------------------------------------------------------------
  237.  
  238. # ------------------------------------------------------------
  239. # # 27.1、__del__ 实例1
  240. # # # 情况一:程序运行结束之后,就会触发 __del__
  241. # # # 情况2 :删除实例,就会触发 __del__
  242. # ------------------------------------------------------------
  243.  
  244. # ------------------------------------------------------------
  245. # # 28、__call__ 的引入
  246. # ------------------------------------------------------------
  247.  
  248. # ------------------------------------------------------------
  249. # # 28.1、__call__ 演示
  250. # ------------------------------------------------------------
  251.  
  252. # ------------------------------------------------------------
  253. # # 29、迭代器的协议的引入
  254. # # # (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,
  255. # # # 调用了他们内部的__iter__方法,把他们变成了可迭代对象; 而下面的类中,是一个对象,但是
  256. # # # 并不是一个可迭代对象
  257. # ------------------------------------------------------------
  258.  
  259. # ------------------------------------------------------------
  260. # # 30、迭代器的协议
  261. # # # (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,
  262. # # # 调用了他们内部的__iter__方法,把他们变成了可迭代对象;
  263. # # # 而下面的类中,是一个对象,在类中引入iter与next使它变成一个选代器
  264. # ------------------------------------------------------------
  265.  
  266. # ------------------------------------------------------------
  267. # # 30.1、迭代器协议实现斐波那契数列
  268. # # # 斐波那契数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...
  269. # # #
  270. # ------------------------------------------------------------
  271.  
  272. # ------------------------------------------------------------
  273. # # 31、描述符的介绍
  274. # # # 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
  275. # # #__get__():调用一个属性时,触发
  276. # # #__set__():为一个属性赋值时,触发
  277. # # #__delete__():采用del删除属性时,触发
  278. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  279. # ------------------------------------------------------------
  280.  
  281. # ------------------------------------------------------------
  282. # # 31.1、定义一个描述符
  283. # # # 在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
  284. # ------------------------------------------------------------
  285.  
  286. # ------------------------------------------------------------
  287. # # 32、描述符与实例的关系
  288. # # # 描述符是干什么的:描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这
  289. # # # 个类的类属性,不能定义到构造函数中
  290. # ------------------------------------------------------------
  291.  
  292. # ------------------------------------------------------------
  293. # # 33、描述符的的使用
  294. # # # 注意到,下面的实例是的数值数属是 类级别的
  295. # ------------------------------------------------------------
  296.  
  297. # ------------------------------------------------------------
  298. # # 33.1、含有描述符的实例与类的关系
  299. # ------------------------------------------------------------
  300.  
  301. # ------------------------------------------------------------
  302. # # 34、描述符之一,数据描述符
  303. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  304. # # # 一 数据描述符:至少实现了__get__()和__set__()
  305. # ------------------------------------------------------------
  306.  
  307. # ------------------------------------------------------------
  308. # # 35、描述符之二,非数据描述符
  309. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  310. # # # 二 非数据描述符:没有实现__set__()
  311. # ------------------------------------------------------------
  312.  
  313. # ------------------------------------------------------------
  314. # # 35.1、描述符之二,非数据描述符
  315. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  316. # # # 二 非数据描述符:没有实现__set__()
  317. # ------------------------------------------------------------
  318.  
  319. # ------------------------------------------------------------
  320. # # 36、描述符之优先级别,类属性>数据描述
  321. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  322. # # # 二 非数据描述符:没有实现__set__()
  323. # ------------------------------------------------------------
  324.  
  325. # ------------------------------------------------------------
  326. # # 36.1、描述符之优先级别,类属性>数据描述
  327. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  328. # # # 二 非数据描述符:没有实现__set__()
  329. # ------------------------------------------------------------
  330.  
  331. # ------------------------------------------------------------
  332. # # 36.2、描述符之优先级别,实例属性>非数据描述符
  333. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  334. # # # 二 非数据描述符:没有实现__set__()
  335. # ------------------------------------------------------------
  336.  
  337. # ------------------------------------------------------------
  338. # # 36.3、描述符之优先级别,实例属性>非数据描述符
  339. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  340. # # # 二 非数据描述符:没有实现__set__()
  341. # ------------------------------------------------------------
  342.  
  343. # ------------------------------------------------------------
  344. # # 36.4、描述符之优先级别,实例属性>非数据描述符
  345. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  346. # # # 二 非数据描述符:没有实现__set__()
  347. # ------------------------------------------------------------
  348.  
  349. # ------------------------------------------------------------
  350. # # 37、非数据描述符>找不到
  351. # ------------------------------------------------------------
  352.  
  353. # ------------------------------------------------------------
  354. # # 38、不同目录级别下的文件路径处理1
  355. # # # 注:下面的这种方式的文件路径是没有处理的主,不建 讠义 使用;
  356. # ------------------------------------------------------------
  357.  
  358. # ------------------------------------------------------------
  359. # # 38.1、不同目录级别下的文件路径处理2
  360. # # # 注:下面的这种方式的文件路径是进行了处理,建 讠义 使用;这样,当工程文件的拷贝到了不同的止录下,
  361. # # # 都是可以使用的
  362. # ------------------------------------------------------------


  1. # ------------------------------------------------分割线-------------------------------------------------
  2. # ------------------------------------------------分割线-------------------------------------------------
  3. # ------------------------------------------------分割线-------------------------------------------------

  1.  
  1. # 01 os模块复习
  2. # 01 os模块复习
  3. '''
  4. # ------------------------------------------------------------
  5. # # 1、argv
  6. # # # 在命令行参数是一个空列表,在其他中第一个列表元素中程序本身的路径
  7. # # # 通过命令终端来运行下面的程序,在pycharm中,编译器会自动处理,因此会报错
  8. # ------------------------------------------------------------
  9. '''
  10. #
  11. # import sys,os
  12. # li = sys.argv
  13. #
  14. # if li[1] == "post":
  15. # print("post")
  16. #
  17. # elif li[1] == 'down':
  18. # print("1111111")
  19. #
  20. #
  21. # # 命令终端运行结果如下
  22. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie>python file.py post
  23. # # post
  24. # #
  25. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie>python file.py down
  26. # # 1111111
  27. # #
  28.  
  29. '''
  30. # ------------------------------------------------------------
  31. # # 2、sys.path
  32. # # # 返回模块的搜索路径,初始化时使用python PATH环境变量的值
  33. # ------------------------------------------------------------
  34. '''
  35. #
  36. # import sys
  37. # print("sys.path: ", sys.path)
  38. # for i in sys.path:
  39. # print(i)
  40. #
  41. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  42. # # sys.path: ['D:\\C_cache\\py\\day27_MianXiangDuiXiangJinJie', 'D:\\C_cache\\py\\day27_MianXiangDuiXiangJinJie', 'D:\\Anaconda3\\python36.zip', 'D:\\Anaconda3\\DLLs', 'D:\\Anaconda3\\lib', 'D:\\Anaconda3', 'D:\\Anaconda3\\lib\\site-packages', 'D:\\Anaconda3\\lib\\site-packages\\win32', 'D:\\Anaconda3\\lib\\site-packages\\win32\\lib', 'D:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'D:\\Program Files (x86)\\PyCharm 2018.1.3\\helpers\\pycharm_matplotlib_backend']
  43. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie
  44. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie
  45. # # D:\Anaconda3\python36.zip
  46. # # D:\Anaconda3\DLLs
  47. # # D:\Anaconda3\lib
  48. # # D:\Anaconda3
  49. # # D:\Anaconda3\lib\site-packages
  50. # # D:\Anaconda3\lib\site-packages\win32
  51. # # D:\Anaconda3\lib\site-packages\win32\lib
  52. # # D:\Anaconda3\lib\site-packages\Pythonwin
  53. # # D:\Program Files (x86)\PyCharm 2018.1.3\helpers\pycharm_matplotlib_backend
  54. # #
  55. # # Process finished with exit code 0
  56.  
  57. '''
  58. # ------------------------------------------------------------
  59. # # 3、getcwd、chdir、r字符串
  60. # # # getcwd 获取当前的文件路径
  61. # # # chdir 更改文件路径
  62. # # # r字符串 正则表达式r的作用,让"D:\Program Files (x86)"的“\”不再具备有特殊意义
  63. # # # 即“\\” == r“\”
  64. # ------------------------------------------------------------
  65. '''
  66. #
  67. # import os
  68. # print(os.getcwd()) # 尽量少用这个,用sys.path
  69. # # 正则表达式r的作用,让"D:\Program Files (x86)"的“\”不再具备有特殊意义
  70. # # 即“\\” == r“\”
  71. # os.chdir(r"D:\Program Files (x86)")
  72. # print(os.getcwd())
  73. #
  74. # # 使用\\
  75. # os.chdir("C:\\Windows\\Boot")
  76. # print(os.getcwd())
  77. #
  78. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  79. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie
  80. # # D:\Program Files (x86)
  81. # # C:\Windows\Boot
  82. # #
  83. # # Process finished with exit code 0
  84.  
  85. '''
  86. # ------------------------------------------------------------
  87. # # 4、路径拼接,os.path.join
  88. # ------------------------------------------------------------
  89. '''
  90. #
  91. # import os
  92. # print(os.path.join("D:\\C_cache\\py"))
  93. # print(os.path.join(r"D:\C_cache\py") )
  94. # print(os.path.join("D:\\C_cache\\py", 'www', 'baidu'))
  95. #
  96. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  97. # # D:\C_cache\py
  98. # # D:\C_cache\py
  99. # # D:\C_cache\py\www\baidu
  100. # #
  101. # # Process finished with exit code 0
  102.  
  103. '''
  104. # ------------------------------------------------------------
  105. # # 4.1、路径拼接2, os.path.join
  106. # ------------------------------------------------------------
  107. '''
  108. #
  109. # import os
  110. # print(os.getcwd()) # 尽量少用这个,用sys.path
  111. # # __file__是pycharm内置的方法,获取的运行的文件名,在编译器处理的时候,会自动加上前面的文件路径
  112. # print( os.path.dirname(os.path.abspath(__file__)))
  113. # print(os.path.join(os.path.dirname(os.path.abspath(__file__)),"bb","123.txt"))
  114. #
  115. #
  116. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  117. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie
  118. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie
  119. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie\bb\123.txt
  120. # # D:\C_cache\py\day27_MianXiangDuiXiangJinJie\bb\123.txt
  121. # #
  122. # # Process finished with exit code 0
  123.  
  124. '''
  125. # ------------------------------------------------------------
  126. # # 5、判断该运行文件中是否有该属性x
  127. # # # day27_MianXiangDuiXiangJinJie 是当前的文件运行名称
  128. # ------------------------------------------------------------
  129. '''
  130. #
  131. # import day27_MianXiangDuiXiangJinJie as obj
  132. # x = 1
  133. # y = 9
  134. # print('x===>>', hasattr(obj,'x')) # 直接运行,每一个都运行了两遍
  135. # print('y===>>', hasattr(obj,'y')) # 直接运行,每一个都运行了两遍
  136. #
  137. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/file.py
  138. # # x===>> True
  139. # # y===>> True
  140. # # x===>> True
  141. # # y===>> True
  142. # #
  143. # # Process finished with exit code 0
  144.  
  145. '''
  146. # ------------------------------------------------------------
  147. # # 5.1、判断该运行文件中是否有该属性2
  148. # # # 解决序列5的问题
  149. # # # __name__ 当前的运行文件
  150. # # # sys.modules 储存挡墙的运行文件的模块名称列表
  151. # ------------------------------------------------------------
  152. '''
  153. #
  154. # import sys
  155. # x = 1
  156. # y = 9
  157. # print("__name__: ", __name__)
  158. # obj = sys.modules[__name__] # 获取到当前文件的运行名称
  159. #
  160. # print('x===>>', hasattr(obj,'x')) # 直接运行,每一个都运行了两遍
  161. # print('y===>>', hasattr(obj,'y')) # 直接运行,每一个都运行了两遍
  162. #
  163. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/file.py
  164. # # __name__): __main__
  165. # # x===>> True
  166. # # y===>> True
  167. # #
  168. # # Process finished with exit code 0
  169.  
  170. '''
  171. # ------------------------------------------------------------
  172. # # 6、__setattr__,__delattr__,__getattr__的应用对象
  173. # # # 这三者的应用对象是类的“实例”;类本身并不会被影响到
  174. # ------------------------------------------------------------
  175. '''
  176. #
  177. # class Foo:
  178. # x=1
  179. # def __init__(self,y):
  180. # self.y=y
  181. #
  182. # def __getattr__(self, item):
  183. # print('----> from getattr:你找的属性不存在')
  184. #
  185. # def __setattr__(self, key, value):
  186. # print('----> from setattr')
  187. # # self.key=value #这就无限递归了,你好好想想
  188. # # self.__dict__[key]=value #应该使用它
  189. #
  190. # def __delattr__(self, item):
  191. # print('----> from delattr')
  192. # # del self.item #无限递归了
  193. # self.__dict__.pop(item)
  194. #
  195. # f1 = Foo("zhang")
  196. # f1.x = 10
  197. # f1.z = "z"
  198. #
  199. # # 并不会触发属性
  200. # Foo.A = "A"
  201. # Foo.B = "B"
  202. # #
  203. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  204. # # ----> from setattr
  205. # # ----> from setattr
  206. # # ----> from setattr
  207. # #
  208. # # Process finished with exit code 0
  209.  
  210. # 03 内置函数补充及getattribute
  211. # 03 内置函数补充及getattribute
  212.  
  213. '''
  214. # ------------------------------------------------------------
  215. # # 7、isinstance
  216. # # # isinstance(obj,cls)检查是否obj是否是类 cls 的对象
  217. # ------------------------------------------------------------
  218. '''
  219. #
  220. # class Foo:
  221. # pass
  222. #
  223. # class Bar(Foo):
  224. # pass
  225. #
  226. # b1 = Bar()
  227. # print(isinstance(b1, Bar))
  228. # print(isinstance(b1, Foo))
  229. #
  230. # print(type(b1))
  231. #
  232. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  233. # # True
  234. # # True
  235. # # <class '__main__.Bar'>
  236. # # <class 'list'>
  237. # #
  238. # # Process finished with exit code 0
  239.  
  240. '''
  241. # ------------------------------------------------------------
  242. # # 8、issubclass
  243. # # # issubclass(sub, super)检查sub类是否是 super 类的派生类
  244. # ------------------------------------------------------------
  245. '''
  246. #
  247. # class Foo:
  248. # pass
  249. #
  250. # class Bar(Foo):
  251. # pass
  252. #
  253. # class cls:
  254. # pass
  255. #
  256. # print(issubclass(Bar, Foo))
  257. # print(issubclass(cls, Foo))
  258. # print(issubclass(Bar, object))
  259. # print(issubclass(Foo, object))
  260. #
  261. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  262. # # True
  263. # # False
  264. # # True
  265. # # True
  266. # #
  267. # # Process finished with exit code 0
  268.  
  269. '''
  270. # ------------------------------------------------------------
  271. # # 9、getattribute
  272. # # # 只要与实例相关的都会触发该操作
  273. # # # getattribute的优先级别高于getattr
  274. # ------------------------------------------------------------
  275. '''
  276. #
  277. # class Foo:
  278. # def __init__(self, name):
  279. # self.name = name
  280. #
  281. # def __getattr__(self, item):
  282. # print("执行的是getattr!触发的内容是【%s】"%item)
  283. #
  284. # # def __getattribute__(self, item):
  285. # # print("执行的是getattribute!触发的内容是【%s】"%item)
  286. #
  287. # def func(self):
  288. # pass
  289. #
  290. # f1 = Foo("我是哈")
  291. # print("Foo.__dict__: ", Foo.__dict__)
  292. # Foo.func("随便写")
  293. #
  294. # print("f1.__dict__: ", f1.__dict__) # __getattribute__会触发
  295. #
  296. # print("f1.name: ", f1.name)
  297. # print("f1.name: ", f1.name99999999999) # 不存在的函数属性
  298. #
  299. # print("f1.__dict__: ", f1.__dict__)
  300. #
  301. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  302. # # Foo.__dict__: {'__module__': '__main__', '__init__': <function Foo.__init__ at 0x0000000001D41EA0>, '__getattr__': <function Foo.__getattr__ at 0x00000000029A4620>, '__getattribute__': <function Foo.__getattribute__ at 0x00000000039EE7B8>, 'func': <function Foo.func at 0x00000000039EE840>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  303. # # 执行的是getattribute!触发的内容是【__dict__】
  304. # # f1.__dict__: None
  305. # # # 执行的是getattribute!触发的内容是【name】
  306. # # # f1.name: None
  307. # # 执行的是getattribute!触发的内容是【__dict__】
  308. # # f1.__dict__: None
  309. # #
  310. # # Process finished with exit code 0
  311. # #
  312. # #
  313. # #
  314.  
  315. '''
  316. # ------------------------------------------------------------
  317. # # 9.1、getattribute被屏蔽时,getattr的情况
  318. # # # 只要与实例相关的都会触发该操作
  319. # # # getattribute的优先级别高于 getattr
  320. # ------------------------------------------------------------
  321. '''
  322. #
  323. # class Foo:
  324. # def __init__(self, name):
  325. # self.name = name
  326. #
  327. # def __getattr__(self, item):
  328. # print("执行的是getattr!触发的内容是【%s】"%item)
  329. #
  330. # # def __getattribute__(self, item):
  331. # # print("执行的是getattribute!触发的内容是【%s】"%item)
  332. #
  333. # def func(self):
  334. # pass
  335. #
  336. # f1 = Foo("我是哈")
  337. # print("Foo.__dict__: ", Foo.__dict__)
  338. # Foo.func("随便写")
  339. #
  340. # print("f1.__dict__: ", f1.__dict__) # __getattribute__会触发
  341. #
  342. # print("f1.name: ", f1.name)
  343. # print("f1.name: ", f1.name99999999999) # 不存在的函数属性
  344. #
  345. # print("f1.__dict__: ", f1.__dict__)
  346. #
  347. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  348. # # Foo.__dict__: {'__module__': '__main__', '__init__': <function Foo.__init__ at 0x0000000001D41EA0>, '__getattr__': <function Foo.__getattr__ at 0x00000000029A4620>, '__getattribute__': <function Foo.__getattribute__ at 0x00000000039EE7B8>, 'func': <function Foo.func at 0x00000000039EE840>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  349. # # 执行的是getattribute!触发的内容是【__dict__】
  350. # # f1.__dict__: None
  351. # # # 执行的是getattribute!触发的内容是【name】
  352. # # # f1.name: None
  353. # # 执行的是getattribute!触发的内容是【__dict__】
  354. # # f1.__dict__: None
  355. # #
  356. # # Process finished with exit code 0
  357. # #
  358.  
  359. '''
  360. # ------------------------------------------------------------
  361. # # 10、AttributeError
  362. # # # 自定义的抛出异常
  363. # ------------------------------------------------------------
  364. '''
  365. #
  366. # raise AttributeError("这个是我自定义的抛出异常")
  367. #
  368. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  369. # # Traceback (most recent call last):
  370. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 458, in <module>
  371. # # raise AttributeError("这个是我自定义的抛出异常")
  372. # # AttributeError: 这个是我自定义的抛出异常
  373. # #
  374. # # Process finished with exit code 1
  375.  
  376. '''
  377. # ------------------------------------------------------------
  378. # # 11.1、 __getattr__的作用
  379. # # # 属性不存在的时候会触发 __getattr__
  380. # # # 类是不会触发 __getattr__
  381. # ------------------------------------------------------------
  382. '''
  383. #
  384. # class Foo:
  385. # def __init__(self, name):
  386. # self.name = name
  387. #
  388. # def __getattr__(self, item):
  389. # print("执行的是getattr!触发的内容是【%s】"%item)
  390. #
  391. # def func(self):
  392. # pass
  393. #
  394. # f1 = Foo("我是哈")
  395. #
  396. # print("分割线111".center(100,"-"))
  397. # print("f1.__dict__: ", f1.__dict__)
  398. #
  399. # print("分割线222".center(100,"-"))
  400. # print("f1.name: ", f1.name) # 属性有的内容
  401. # print("f1.name: ", f1.name99999999999) # 不存在的属性内容
  402. #
  403. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  404. # # Foo.__dict__: {'__module__': '__main__', '__init__': <function Foo.__init__ at 0x00000000020A1EA0>, '__getattr__': <function Foo.__getattr__ at 0x00000000029A4620>, 'func': <function Foo.func at 0x0000000003A2E7B8>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  405. # # -----------------------------------------------分割线111-----------------------------------------------
  406. # # f1.__dict__: {'name': '我是哈'}
  407. # # -----------------------------------------------分割线222-----------------------------------------------
  408. # # f1.name: 我是哈
  409. # # 执行的是getattr!触发的内容是【name99999999999】
  410. # # f1.name: None
  411. # # -----------------------------------------------分割线333-----------------------------------------------
  412. # # f1.__dict__: {'name': '我是哈'}
  413. # #
  414. # # Process finished with exit code 0
  415. #
  416.  
  417. '''
  418. # ------------------------------------------------------------
  419. # # 11.2、 只有__getattribute__存在的情况,没有写入raise AttributeError
  420. # # # 情况一:没有写入raise AttributeError;
  421. # # # 不管属性的内容有,还是没有,都会正常运行,程序不会报错
  422. # # # 情况二:写入raise AttributeError;
  423. # # # 报错,即使是属性有的内容们也会报错,因为运行后,直接触发raise AttributeError
  424. # # # 触发后,没有__getattr__来处理
  425. # # #
  426. # # # 总的来说,如果__getattribute__有的内容,就不会触发 raise AttributeError;
  427. # # # 如果没有,就是触发raise AttributeError;
  428. # # # 下面演示中 __getattr__被注释掉了,因此触发的AttributeError无法让__getattr__来处理,才回报错
  429. # ------------------------------------------------------------
  430. '''
  431. #
  432. # class Foo:
  433. # def __init__(self, name):
  434. # self.name = name
  435. #
  436. # # def __getattr__(self, item):
  437. # # print("执行的是getattr!触发的内容是【%s】"%item)
  438. #
  439. # def __getattribute__(self, item):
  440. # print("执行的是getattribute!触发的内容是【%s】"%item)
  441. # # 有了raise之后,如果有,就会直接触发__getattr__;
  442. # # 如果没有,就是会触发raise AttributeError
  443. # raise AttributeError("《《抛出异常》》")
  444. #
  445. # def func(self):
  446. # pass
  447. #
  448. # f1 = Foo("我是哈")
  449. #
  450. # print("分割线111".center(100,"-"))
  451. # print("f1.__dict__: ", f1.__dict__)
  452. #
  453. # print("分割线222".center(100,"-"))
  454. # print("f1.name: ", f1.name) # 属性有的内容
  455. # print("f1.name: ", f1.name99999999999) # 不存在的属性内容
  456. #
  457. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  458. # # -----------------------------------------------分割线111-----------------------------------------------
  459. # # 执行的是getattribute!触发的内容是【__dict__】
  460. # # Traceback (most recent call last):
  461. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 582, in <module>
  462. # # print("f1.__dict__: ", f1.__dict__)
  463. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 574, in __getattribute__
  464. # # raise AttributeError("《《抛出异常》》")
  465. # # AttributeError: 《《抛出异常》》
  466. # #
  467. # # Process finished with exit code 1
  468.  
  469. '''
  470. # ------------------------------------------------------------
  471. # # 11.3、 __getattribute__与__getattr__ ,没有raise
  472. # # # 没有raise是不会触发__getattr__;
  473. # ------------------------------------------------------------
  474. '''
  475. #
  476. # class Foo:
  477. # def __init__(self, name):
  478. # self.name = name
  479. #
  480. # def __getattr__(self, item):
  481. # print("执行的是getattr!触发的内容是【%s】"%item)
  482. #
  483. # def __getattribute__(self, item):
  484. # print("执行的是getattribute!触发的内容是【%s】"%item)
  485. # # 有了raise之后,如果有,就会直接触发__getattr__;
  486. # # 如果没有,就是会触发raise AttributeError
  487. # # raise AttributeError("《《抛出异常》》")
  488. #
  489. #
  490. #
  491. # def func(self):
  492. # pass
  493. #
  494. # f1 = Foo("我是哈")
  495. # print("Foo.__dict__: ", Foo.__dict__)
  496. # # 类是不会触发__getattribute__
  497. # Foo.func("随便写")
  498. #
  499. # print("分割线111".center(100,"-"))
  500. # # __getattribute__会触发;__getattribute__触发后,没有将属性设置进f1实例里面,因此f1为空
  501. # print("f1.__dict__: ", f1.__dict__)
  502. #
  503. # print("分割线222".center(100,"-"))
  504. # print("f1.name: ", f1.name) # 属性有的内容
  505. # print("f1.name: ", f1.name99999999999) # 不存在的属性有的内容
  506. #
  507. # print("分割线333".center(100,"-"))
  508. # print("f1.__dict__: ", f1.__dict__)
  509. #
  510. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  511. # # Foo.__dict__: {'__module__': '__main__', '__init__': <function Foo.__init__ at 0x00000000003C1EA0>, '__getattr__': <function Foo.__getattr__ at 0x0000000002994620>, '__getattribute__': <function Foo.__getattribute__ at 0x00000000039EE7B8>, 'func': <function Foo.func at 0x00000000039EE840>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  512. # # -----------------------------------------------分割线111-----------------------------------------------
  513. # # 执行的是getattribute!触发的内容是【__dict__】
  514. # # f1.__dict__: None
  515. # # -----------------------------------------------分割线222-----------------------------------------------
  516. # # 执行的是getattribute!触发的内容是【name】
  517. # # f1.name: None
  518. # # 执行的是getattribute!触发的内容是【name99999999999】
  519. # # f1.name: None
  520. # # -----------------------------------------------分割线333-----------------------------------------------
  521. # # 执行的是getattribute!触发的内容是【__dict__】
  522. # # f1.__dict__: None
  523. # #
  524. # # Process finished with exit code 0
  525. #
  526.  
  527. '''
  528. # ------------------------------------------------------------
  529. # # 11.4、 __getattribute__与__getattr__与raise
  530. # # # 有了raise之后,无论属性有没有都会执行,raise AttributeError,
  531. # # # 之后,就会直接触发__getattr__;
  532. # ------------------------------------------------------------
  533. '''
  534.  
  535. # class Foo:
  536. # def __init__(self, name):
  537. # self.name = name
  538. #
  539. # def __getattr__(self, item):
  540. # print("执行的是getattr!触发的内容是【%s】"%item)
  541. #
  542. # def __getattribute__(self, item):
  543. # print("执行的是getattribute!触发的内容是【%s】"%item)
  544. # # 有了raise之后,如果有,就会直接触发__getattr__;
  545. # # 如果没有,就是会触发raise AttributeError
  546. # raise AttributeError("《《抛出异常》》")
  547. #
  548. #
  549. #
  550. # def func(self):
  551. # pass
  552. #
  553. # f1 = Foo("我是哈")
  554. # print("Foo.__dict__: ", Foo.__dict__)
  555. # # 类是不会触发__getattribute__
  556. # Foo.func("随便写")
  557. #
  558. # print("分割线111".center(100,"-"))
  559. # # __getattribute__会触发;__getattribute__触发后,没有将属性设置进f1实例里面,因此f1为空
  560. # print("f1.__dict__: ", f1.__dict__)
  561. #
  562. # print("分割线222".center(100,"-"))
  563. # print("f1.name: ", f1.name) # 属性有的内容
  564. # print("f1.name: ", f1.name99999999999) # 不存在的属性有的内容
  565. #
  566. # print("分割线333".center(100,"-"))
  567. # print("f1.__dict__: ", f1.__dict__)
  568. #
  569. #
  570. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  571. # # Foo.__dict__: {'__module__': '__main__', '__init__': <function Foo.__init__ at 0x0000000001D41EA0>, '__getattr__': <function Foo.__getattr__ at 0x00000000029A4620>, '__getattribute__': <function Foo.__getattribute__ at 0x00000000039EE7B8>, 'func': <function Foo.func at 0x00000000039EE840>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  572. # # -----------------------------------------------分割线111-----------------------------------------------
  573. # # 执行的是getattribute!触发的内容是【__dict__】
  574. # # 执行的是getattr!触发的内容是【__dict__】
  575. # # f1.__dict__: None
  576. # # -----------------------------------------------分割线222-----------------------------------------------
  577. # # 执行的是getattribute!触发的内容是【name】
  578. # # 执行的是getattr!触发的内容是【name】
  579. # # f1.name: None
  580. # # 执行的是getattribute!触发的内容是【name99999999999】
  581. # # 执行的是getattr!触发的内容是【name99999999999】
  582. # # f1.name: None
  583. # # -----------------------------------------------分割线333-----------------------------------------------
  584. # # 执行的是getattribute!触发的内容是【__dict__】
  585. # # 执行的是getattr!触发的内容是【__dict__】
  586. # # f1.__dict__: None
  587. # #
  588. # # Process finished with exit code 0
  589.  
  590. '''
  591. # ------------------------------------------------------------
  592. # # 12、 __getattribute__与__getattr__总结
  593. (采用系统默认的方式)自己定义的类中没有 __getattribute__与__getattr__:
  594. __getattr__ __getattr__触发的前提是属性调用不存在的情况
  595. __getattribute__ 不会触发
  596.  
  597. (自定义)方式一,自己定义的类中没有 __getattribute__,但是有__getattr__:
  598. __getattr__ __getattr__触发的前提是属性调用不存在的情况,触发的内容根据自己所定义的
  599. __getattribute__ 不会触发
  600.  
  601. (自定义)方式二,自己定义的类中有 __getattribute__,但是没有__getattr__:
  602. __getattribute__ 情况一:没有raise AttributeError,不论调用的属性内容是否存在,都会触发该内容
  603. 情况二:有raise AttributeError, 不论调用的属性内容是否存在,都会触发该内容,
  604. 在运行到AttributeError时,会都会执行,这个时候,报错
  605.  
  606. (自定义)方式三,自己定义的类中有 __getattribute__,有__getattr__:
  607. __getattribute__ 情况一:没有raise AttributeError,不论调用的属性内容是否存在,都会触发__getattribute__,但是不会__getattr__
  608. __getattribute__,__getattr__中只有__getattribute__会执行
  609. 情况二:raise AttributeError, 不论调用的属性内容是否存在,都会触发__getattribute__,
  610. 在运行到AttributeError时,会都会执行,这个时候,会将AttributeError报错的内容触发__getattr__
  611. 此时, __getattribute__,__getattr__都会执行
  612.  
  613. # ------------------------------------------------------------
  614. '''
  615.  
  616. # ------------------------------------------------分割线-------------------------------------------------
  617. # 05 item系列
  618. # 05 item系列
  619. #
  620.  
  621. '''
  622. # ------------------------------------------------------------
  623. # # 13、__setitem__设置属性,
  624. # # # f1["age"] = 18 这种方式才回触发__setitem__
  625. # # # __setitem__操作的是[], 注意与前面的__setattr__区别
  626. # ------------------------------------------------------------
  627. '''
  628. #
  629. # class Foo:
  630. # def __setitem__(self, key, value):
  631. # print("【__setitem__】 ")
  632. # self.__dict__[key] = value
  633. #
  634. # f1 = Foo()
  635. # print("f1.__dict__: ", f1.__dict__)
  636. #
  637. # # “.”的方式进行添加
  638. # f1.name = 'egon'
  639. # print("f1.__dict__: ", f1.__dict__)
  640. #
  641. # # 类似于字典的方式添加
  642. # f1["age"] = 18 # 这种方式才会触发setitem
  643. # print("f1.__dict__: ", f1.__dict__)
  644. #
  645. #
  646. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  647. # # f1.__dict__: {}
  648. # # f1.__dict__: {'name': 'egon'}
  649. # # 【__setitem__】
  650. # # f1.__dict__: {'name': 'egon', 'age': 18}
  651. # #
  652. # # Process finished with exit code 0
  653.  
  654. '''
  655. # ------------------------------------------------------------
  656. # # 14、__delitem__
  657. # # # del f1['age'] 这种方式才会触发 __delitem__
  658. # # # __setitem__操作的是[], 注意与前面的__delattr__区别
  659. # ------------------------------------------------------------
  660. '''
  661. #
  662. # class Foo:
  663. # def __init__(self, name, age, domicile):
  664. # self.name = name
  665. # self.age = age
  666. # self.domicile = domicile
  667. #
  668. # def __setitem__(self, key, value):
  669. # self.__dict__[key] = value
  670. # print("【__setitem__】,属性添加成功!!")
  671. #
  672. # def __delitem__(self, key):
  673. # print("【__delitem__】 ")
  674. # self.__dict__.pop(key) # 汪意, 这里是花括号
  675. #
  676. # f1 = Foo("张哈", 22, "北京")
  677. # f1["sex"] = "male"
  678. # print("f1.__dict__: ", f1.__dict__)
  679. #
  680. # print("==>>del f1.domicile")
  681. # del f1.domicile
  682. # print("==>>del f1['age']")
  683. # del f1['age']
  684. #
  685. # print("f1.__dict__: ", f1.__dict__)
  686. #
  687. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  688. # # 【__setitem__】,属性添加成功!!
  689. # # f1.__dict__: {'name': '张哈', 'age': 22, 'domicile': '北京', 'sex': 'male'}
  690. # # ==>>del f1.domicile
  691. # # ==>>del f1['age']
  692. # # 【__delitem__】
  693. # # f1.__dict__: {'name': '张哈', 'sex': 'male'}
  694. # #
  695. # # Process finished with exit code 0
  696.  
  697. '''
  698. # ------------------------------------------------------------
  699. # # 15、__getitem__
  700. # # # f1["age"]这种方式才会触发 __getitem__
  701. # # # __getitem__[], 注意与前面的__getattr__区别
  702. # ------------------------------------------------------------
  703. '''
  704. #
  705. # class Foo:
  706. # def __init__(self, name, age, domicile):
  707. # self.name = name
  708. # self.age = age
  709. # self.domicile = domicile
  710. # def __getitem__(self, item):
  711. # print("【getitem】 ", item)
  712. # return self.__dict__[item]
  713. #
  714. # def __setitem__(self, key, value):
  715. # self.__dict__[key] = value
  716. # print("【__setitem__】,属性添加成功!!")
  717. #
  718. # def __delitem__(self, key):
  719. # print("【__delitem__】己经删除%s = %s" % (key, self.__dict__[key]))
  720. # self.__dict__.pop(key) # 汪意, 这里是花括号
  721. #
  722. #
  723. # f1 = Foo("张哈", 22, "北京")
  724. # f1["sex"] = "male"
  725. # print("f1.__dict__: ", f1.__dict__)
  726. # f1["age"]
  727. # del f1["domicile"]
  728. #
  729. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  730. # # 【__setitem__】,属性添加成功!!
  731. # # f1.__dict__: {'name': '张哈', 'age': 22, 'domicile': '北京', 'sex': 'male'}
  732. # # 【getitem】 age
  733. # # 【__delitem__】己经删除domicile = 北京
  734. # #
  735. # # Process finished with exit code 0
  736.  
  737. '''
  738. # ------------------------------------------------------------
  739. # # 16、__str__
  740. # # # 改变的是输出到窗口的信息, 与print(f2) ,print(file) 对比
  741. # # # str函数或者print函数--->obj.__str__()
  742. # ------------------------------------------------------------
  743. '''
  744. #
  745. # l = list('hello')
  746. #
  747. # print(l)
  748. # file = open('test.txt', 'w')
  749. # print(file) # 输出的信息是默认的
  750. #
  751. # class Foo:
  752. # def __init__(self, name, age, domicile):
  753. # self.name = name
  754. # self.age = age
  755. # self.domicile = domicile
  756. #
  757. # def __str__(self):
  758. # return "这是自定义的显示方式"
  759. # class func:
  760. # pass
  761. #
  762. # f1 = Foo("tom", 22, "魔都")
  763. # f2 = func()
  764. #
  765. # print(f1) # 输出的信息是修改的
  766. # print(f1.name)
  767. #
  768. # print(f2) # 输出的信息是修改的
  769. #
  770. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  771. # # ['h', 'e', 'l', 'l', 'o']
  772. # # <_io.TextIOWrapper name='test.txt' mode='w' encoding='cp936'>
  773. # # 这是自定义的显示方式
  774. # # tom
  775. # # <__main__.func object at 0x0000000002975BA8>
  776. # #
  777. # # Process finished with exit code 0
  778.  
  779. '''
  780. # ------------------------------------------------------------
  781. # # 17、str(f1), f1.__str__()
  782. # # # str(f1)--->f1.__str__()
  783. # ------------------------------------------------------------
  784. '''
  785. #
  786. # class Foo:
  787. # def __init__(self, name, age, domicile):
  788. # self.name = name
  789. # self.age = age
  790. # self.domicile = domicile
  791. #
  792. # def __str__(self):
  793. # return "这是自定义的显示方式"
  794. #
  795. # f1 = Foo("tom", 22, "魔都")
  796. # print(f1) # str(f1)--->f1.__str__()
  797. #
  798. # x = str(f1) # str(f1)--->f1.__str__()
  799. # print(x)
  800. #
  801. # y = f1.__str__()
  802. # print(y)
  803. #
  804. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  805. # # 这是自定义的显示方式
  806. # # 这是自定义的显示方式
  807. # # 这是自定义的显示方式
  808. # #
  809. # # Process finished with exit code 0
  810.  
  811. '''
  812. # ------------------------------------------------------------
  813. # # 17.1、str(f1), f1.__str__()
  814. # # # str(f1)--->f1.__str__()
  815. # ------------------------------------------------------------
  816. '''
  817. #
  818. # class Foo:
  819. # def __init__(self, name, age, domicile):
  820. # self.name = name
  821. # self.age = age
  822. # self.domicile = domicile
  823. #
  824. # def __str__(self):
  825. # return '名字是 %s 年龄是%s' %(self.name, self.age)
  826. #
  827. # f1 = Foo("tom", 22, "魔都")
  828. # print(f1) # str(f1)--->f1.__str__()
  829. #
  830. # x = str(f1) # str(f1)--->f1.__str__()
  831. # print(x)
  832. #
  833. # y = f1.__str__()
  834. # print(y)
  835. #
  836. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  837. # # 名字是 tom 年龄是22
  838. # # 名字是 tom 年龄是22
  839. # # 名字是 tom 年龄是22
  840. # #
  841. # # Process finished with exit code 0
  842.  
  843. '''
  844. # ------------------------------------------------------------
  845. # # 18、repr
  846. # # # repr 或者交互式解释器--->obj.__repr__()
  847. # ------------------------------------------------------------
  848. '''
  849. #
  850. # class Foo:
  851. # def __init__(self, name, age, domicile):
  852. # self.name = name
  853. # self.age = age
  854. # self.domicile = domicile
  855. #
  856. # def __repr__(self):
  857. # return '__repr__==>名字是 %s 年龄是%s' %(self.name, self.age)
  858. #
  859. # f1 = Foo("tom", 22, "魔都")
  860. # print(f1) # str(f1)--->f1.__str__()
  861. #
  862. # x = str(f1) # str(f1)--->f1.__str__()
  863. # print(x)
  864. #
  865. # y = f1.__str__()
  866. # print(y)
  867. # #
  868. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  869. # # __repr__==>名字是 tom 年龄是22
  870. # # __repr__==>名字是 tom 年龄是22
  871. # # __repr__==>名字是 tom 年龄是22
  872. # #
  873. # # Process finished with exit code 0
  874.  
  875. '''
  876. # ------------------------------------------------------------
  877. # # 19、__str__ 与 __repr__
  878. # # # 两者同时出现时,输出打印选择的是__str__
  879. # ------------------------------------------------------------
  880. '''
  881. #
  882. # class Foo:
  883. # def __init__(self, name, age, domicile):
  884. # self.name = name
  885. # self.age = age
  886. # self.domicile = domicile
  887. #
  888. # def __str__(self):
  889. # return '__str__名字是 %s 年龄是%s' %(self.name, self.age)
  890. #
  891. # def __repr__(self):
  892. # return '__repr__==>名字是 %s 年龄是%s' %(self.name, self.age)
  893. #
  894. # f1 = Foo("tom", 22, "魔都")
  895. # print(f1) # str(f1)--->f1.__str__()
  896. #
  897. # x = str(f1) # str(f1)--->f1.__str__()
  898. # print(x)
  899. #
  900. # y = f1.__str__()
  901. # print(y)
  902. #
  903. #
  904. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  905. # # __str__名字是 tom 年龄是22
  906. # # __str__名字是 tom 年龄是22
  907. # # __str__名字是 tom 年龄是22
  908. # #
  909. # # Process finished with exit code 0
  910.  
  911. '''
  912. # ------------------------------------------------------------
  913. # # 20、__str__与__repr__总结
  914. # # # str函数或者print函数--->obj.__str__()
  915. # # # repr或者交互式解释器--->obj.__repr__()
  916. # # # 如果__str__没有被定义,那么就会使用__repr__来代替输出
  917. # # # 两者同时出现时,输出打印选择的是__str__
  918. # # # 注意:这俩方法的返回值必须是字符串,否则抛出异常
  919. # ------------------------------------------------------------
  920. '''
  921.  
  922. # ------------------------------------------------分割线-------------------------------------------------
  923. # 07 自定制format
  924. # 07 自定制format
  925.  
  926. '''
  927. # ------------------------------------------------------------
  928. # # 21、字符串.format
  929. # # #
  930. # ------------------------------------------------------------
  931. '''
  932. #
  933. # x = '{0}{0}{0}'.format("dog")
  934. #
  935. # y1 = "{} {}".format("hello", "world") # 不设置指定位置,按默认顺序
  936. # y2 = "{0} {1}".format("hello", "world") # 设置指定位置
  937. # y3 = "{1} {0} {1}".format("hello", "world") # 设置指定位置
  938. #
  939. #
  940. # print(" x ", x)
  941. # print("y1 ", y1)
  942. # print("y2 ", y2)
  943. # print("y3 ", y3)
  944. #
  945. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  946. # # x dogdogdog
  947. # # y1 hello world
  948. # # y2 hello world
  949. # # y3 world hello world
  950. # #
  951. # # Process finished with exit code 0
  952.  
  953. '''
  954. # ------------------------------------------------------------
  955. # # 22、字符串.format的应用1
  956. # # #
  957. # ------------------------------------------------------------
  958. '''
  959. #
  960. # class Date:
  961. # def __init__(self, year, mon, day):
  962. # self.year = year
  963. # self.mon = mon
  964. # self.day = day
  965. #
  966. #
  967. # d1 = Date(2018, 8, 1)
  968. # x = '{0.year}{0.mon}{0.day}'.format(d1)
  969. # y = '{0.year}:{0.mon}:{0.day}'.format(d1)
  970. # z = '{0.year}-{0.mon}-{0.day}'.format(d1)
  971. #
  972. # print(x)
  973. # print(y)
  974. # print(z)
  975. #
  976. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  977. # # 201881
  978. # # 2018:8:1
  979. # # 2018-8-1
  980. # #
  981. # # Process finished with exit code 0
  982.  
  983. '''
  984. # ------------------------------------------------------------
  985. # # 22.1、format 与类中 __format__ 的关系
  986. # # # 运行时,format 实际上就去调用“对应类”中的 __format__, __format__要有返回值
  987. # ------------------------------------------------------------
  988. '''
  989.  
  990. #
  991. # class Date:
  992. # def __init__(self, year, mon, day):
  993. # self.year = year
  994. # self.mon = mon
  995. # self.day = day
  996. # def __format__(self, format_spec):
  997. # print("我执行啦!!")
  998. # print("format_spec: ", format_spec)
  999. #
  1000. # return "我才只要需要返回值这个事"
  1001. #
  1002. # class person:
  1003. # def __init__(self, name,age):
  1004. # self.name = name
  1005. # self.age = age
  1006. #
  1007. # def __format__(self, format_spec):
  1008. # print("person类调用我,我执行啦!!")
  1009. # print("person类调用我 format_spec: ", format_spec)
  1010. #
  1011. # return "person类调用我, 我给个返回值"
  1012. #
  1013. # #
  1014. # d1 = Date(2018, 8, 1)
  1015. # print(format(d1,"这是什么鬼"))
  1016. #
  1017. # print("分割线".center(100,"-"))
  1018. # p1 = person("li",22)
  1019. # print(format(p1,"这是什么鬼"))
  1020. #
  1021. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1022. # # 我执行啦!!
  1023. # # format_spec: 这是什么鬼
  1024. # # 我才只要需要返回值这个事
  1025. # # ------------------------------------------------分割线-------------------------------------------------
  1026. # # person类调用我,我执行啦!!
  1027. # # person类调用我 format_spec: 这是什么鬼
  1028. # # person类调用我, 我给个返回值
  1029. # #
  1030. # # Process finished with exit code 0
  1031.  
  1032. '''
  1033. # ------------------------------------------------------------
  1034. # # 23、format的应用 之 自定义格式
  1035. # # # 自定义输出日期的格式, 与前面 序号21 对比;
  1036. # # # 运行时,format 实际上就去调用“对应类”中的 __format__, __format__要有返回值
  1037. # ------------------------------------------------------------
  1038. '''
  1039. #
  1040. # format_dic = {
  1041. # 'ymd':'{0.year}{0.mon}{0.day}',
  1042. # 'y:m:d': '{0.year}:{0.mon}:{0.day}',
  1043. # 'y-m-d':'{0.year}-{0.mon}-{0.day}'
  1044. # }
  1045. #
  1046. # class Date:
  1047. # def __init__(self, year, mon, day):
  1048. # self.year = year
  1049. # self.mon = mon
  1050. # self.day = day
  1051. #
  1052. # def __format__(self, format_spec):
  1053. # # format_spec给定的格式不存在,那么,我们给它一个默认的格式方式
  1054. # if format_spec not in format_dic:
  1055. # format_spec = "ymd"
  1056. #
  1057. # # 取 format_spec == ymd ,则 'ymd':'{0.year}{0.mon}{0.day}'
  1058. # tmp = format_dic[format_spec]
  1059. # # '{0.year}{0.mon}{0.day}'.format(d1),这里实例化d1,d1 == self, 则 format会调用python默认的方式处理
  1060. # print("__format__执行完成!")
  1061. # return tmp.format(self)
  1062. # #
  1063. # d1 = Date(2018, 8, 1)
  1064. # print(format(d1,"ymd"))
  1065. # print(format(d1,"y-m-d"))
  1066. #
  1067. # print("分割线".center(100,"-"))
  1068. # print(format(d1,""))
  1069. # print(format(d1,"不存在"))
  1070. #
  1071. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1072. # # __format__执行完成!
  1073. # # 201881
  1074. # # __format__执行完成!
  1075. # # 2018-8-1
  1076. # # ------------------------------------------------分割线-------------------------------------------------
  1077. # # __format__执行完成!
  1078. # # 201881
  1079. # # __format__执行完成!
  1080. # # 201881
  1081. # #
  1082. # # Process finished with exit code 0
  1083.  
  1084. # 08 slots属性
  1085. # 08 slots属性
  1086.  
  1087. '''
  1088. # ------------------------------------------------------------
  1089. # # 24、__slots__介绍
  1090. # # # 1.__slots__是什么:是一个类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)
  1091. # # # 2.引子:使用点来访问属性本质就是在访问类或者对象的__dict__属性字典(类的字典是共享的,而每个实例的是独立的)
  1092. # # # 3.为何使用__slots__:字典会占用大量内存,如果你有一个属性很少的类,但是有很多实例,为了节省内存可以使用__slots__取代实例的__dict__
  1093. # # # 当你定义__slots__后,__slots__就会为实例使用一种更加紧凑的内部表示。实例通过一个很小的固定大小的数组来构建,而不是为每个实例定义一个
  1094. # # # 字典,这跟元组或列表很类似。在__slots__中列出的属性名在内部被映射到这个数组的指定小标上。使用__slots__一个不好的地方就是我们不能再给
  1095. # # # 实例添加新的属性了,只能使用在__slots__中定义的那些属性名。
  1096. # # # 4.注意事项:__slots__的很多特性都依赖于普通的基于字典的实现。另外,定义了__slots__后的类不再 支持一些普通类特性了,比如多继承。大多数情况下,你应该
  1097. # # # 只在那些经常被使用到 的用作数据结构的类上定义__slots__比如在程序中需要创建某个类的几百万个实例对象 。
  1098. # # # 关于__slots__的一个常见误区是它可以作为一个封装工具来防止用户给实例增加新的属性。尽管使用__slots__可以达到这样的目的,但是这个并不是它的初衷。 更多的是用来作为一个内存优化工具。
  1099. # # # ==>>
  1100. # # # 对于 __slots__ 我们关注的是,1、它的存在是为了节约内存; 2、它存在的类中,所有的
  1101. # # # 属性“全部”都取消了实例字典,只有类字典; 3、__slots__ 定以后的变量,不可以在添加新的值,
  1102. # # # 但是可以修改
  1103. # ------------------------------------------------------------
  1104. '''
  1105.  
  1106. '''
  1107. # ------------------------------------------------------------
  1108. # # 24.1、__slots__ 属性值添加
  1109. # ------------------------------------------------------------
  1110. '''
  1111. #
  1112. # class Foo:
  1113. # __slots__ = 'name' # 等价于 {'name':None}
  1114. #
  1115. # f1 = Foo()
  1116. # # 定义好的属性,进行值添加
  1117. # f1.name = 'egon'
  1118. # print(f1.name)
  1119. #
  1120. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1121. # # egon
  1122. # #
  1123. # # Process finished with exit code 0
  1124.  
  1125. '''
  1126. # ------------------------------------------------------------
  1127. # # 24.2、__slots__ 属性值添加
  1128. # ------------------------------------------------------------
  1129. '''
  1130. #
  1131. # class Foo:
  1132. # __slots__ = 'name' # 等价于 {'name':None}
  1133. #
  1134. # f1 = Foo()
  1135. #
  1136. # # 添加新的属性
  1137. # f1.age = 33 # 报错, 不允许添加; --->setattr----->f1.__dict__['age']=18 但是这里取消了实例的字典
  1138. # print(f1.age)
  1139. # print(f1.__dict__) # 报错,没有该字典
  1140. #
  1141. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1142. # # Traceback (most recent call last):
  1143. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 1410, in <module>
  1144. # # f1.age = 33
  1145. # # AttributeError: 'Foo' object has no attribute 'age'
  1146.  
  1147. '''
  1148. # ------------------------------------------------------------
  1149. # # 24.3、__slots__
  1150. # ------------------------------------------------------------
  1151. '''
  1152. #
  1153. # class Foo:
  1154. # __slots__ = ['name', 'age'] # {'name':None,'age':None}
  1155. #
  1156. # f1 = Foo()
  1157. #
  1158. # f1.name ="cheng"
  1159. # f1.age = 33 # 不允许添加
  1160. #
  1161. # print(f1.name)
  1162. # print(f1.age)
  1163. #
  1164. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1165. # # cheng
  1166. # # 33
  1167. # #
  1168. # # Process finished with exit code 0
  1169.  
  1170. #
  1171. # ------------------------------------------------分割线-------------------------------------------------
  1172. # 09 doc属性
  1173. # 09 doc属性
  1174.  
  1175. '''
  1176. # ------------------------------------------------------------
  1177. # # 24.4、 __doc__
  1178. # # # 该属性无法继承给子类; 如果没有对该属性进行赋值的话,那么默认是None
  1179. # ------------------------------------------------------------
  1180. '''
  1181. #
  1182. # class Foo:
  1183. # '这个是Foo的描述作息' # 这个应就是__doc__, 该属性无不法被子类所继承
  1184. # pass
  1185. #
  1186. #
  1187. # class Bar(Foo): # 继承Foo类
  1188. # pass
  1189. #
  1190. # print(Foo.__doc__)
  1191. # print(Bar.__doc__)
  1192. #
  1193. # print(Foo.__dict__)
  1194. # print(Bar.__dict__)
  1195. #
  1196. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1197. # # 这个是Foo的描述作息
  1198. # # None
  1199. # # {'__module__': '__main__', '__doc__': '这个是Foo的描述作息', '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>}
  1200. # # {'__module__': '__main__', '__doc__': None}
  1201. # #
  1202. # # Process finished with exit code 0
  1203.  
  1204. #
  1205. # ------------------------------------------------分割线-------------------------------------------------
  1206. # 10 module和class
  1207. # 10 module和class
  1208.  
  1209. '''
  1210. # ------------------------------------------------------------
  1211. # # 25、 __module__ 与 __class__
  1212. # # #
  1213. # # # __module__ 表示当前操作的对象在那个模块
  1214. # # # __class__ 表示当前操作的对象的类是什么
  1215.  
  1216. 【类C的具体信息】:
  1217. 当前文件路径:D:\C_cache\py\day27_MianXiangDuiXiangJinJie
  1218. 类C 文件路径:D:\C_cache\py\day27_MianXiangDuiXiangJinJie\lib\aa.py
  1219.  
  1220. 【aa.py文件内容】:
  1221. class C:
  1222. def __init__(self):
  1223. self.name = "啥呀"
  1224. # ------------------------------------------------------------
  1225. '''
  1226. #
  1227. # from lib.aa import C # 导入类
  1228. #
  1229. # c1 = C()
  1230. # print(c1.name)
  1231. #
  1232. # print(c1.__module__)
  1233. # print(c1.__class__)
  1234. #
  1235. #
  1236. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1237. # # 啥呀
  1238. # # lib.aa
  1239. # # <class 'lib.aa.C'>
  1240. # #
  1241. # # Process finished with exit code 0
  1242.  
  1243. # 11 析构方法
  1244. # 11 析构方法
  1245.  
  1246. '''
  1247. # ------------------------------------------------------------
  1248. # # 26、__del__析构方法介绍
  1249. # # #
  1250. # # # 析构方法,当对象在内存中被释放时,自动触发执行。
  1251. # # # 注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,
  1252. # # # 如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,
  1253. # # # 比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就
  1254. # # # 用到了__del__
  1255. # ------------------------------------------------------------
  1256. '''
  1257.  
  1258. '''
  1259. # ------------------------------------------------------------
  1260. # # 27、__del__ 实例
  1261. # # # 运行结束之后,就会触发 __del__
  1262. # ------------------------------------------------------------
  1263. '''
  1264. #
  1265. #
  1266. # class Foo:
  1267. # def __init__(self, name):
  1268. # self.name = name
  1269. #
  1270. # def __del__(self):
  1271. # print("我是__del__,我执行结束了!!")
  1272. #
  1273. # f1 = Foo("什么鬼")
  1274. #
  1275. #
  1276. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1277. # # 我是__del__,我执行结束了!!
  1278. # #
  1279. # # Process finished with exit code 0
  1280.  
  1281. '''
  1282. # ------------------------------------------------------------
  1283. # # 27.1、__del__ 实例1
  1284. # # # 情况一:程序运行结束之后,就会触发 __del__
  1285. # # # 情况2 :删除实例,就会触发 __del__
  1286. # ------------------------------------------------------------
  1287. '''
  1288. #
  1289. #
  1290. # class Foo:
  1291. # def __init__(self, name):
  1292. # self.name = name
  1293. #
  1294. # def __del__(self):
  1295. # print("我是__del__,我执行结束了!!")
  1296. #
  1297. # f1 = Foo("什么鬼")
  1298. # f2 = Foo("吃瓜")
  1299. # print("接下来执行,del f1.name ")
  1300. # del f1.name # 删除实例的属性不会触发__del__
  1301. # print("接下来执行,del f2 ")
  1302. # del f2 # 删除实例会触发__del__
  1303. #
  1304. # print("============》》》》》》》》》》》》》")
  1305. # # 程序运行完毕会自动回收内存,触发__del__
  1306. #
  1307. #
  1308. #
  1309. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1310. # # 接下来执行,del f1.name
  1311. # # 接下来执行,del f2
  1312. # # 我是__del__,我执行结束了!!
  1313. # # ============》》》》》》》》》》》》》
  1314. # # 我是__del__,我执行结束了!!
  1315. # #
  1316. # # Process finished with exit code 0
  1317.  
  1318. # 12 call 方法
  1319. # 12 call 方法
  1320.  
  1321. '''
  1322. # ------------------------------------------------------------
  1323. # # 28、__call__ 的引入
  1324. # ------------------------------------------------------------
  1325. '''
  1326. #
  1327. # class Foo:
  1328. # pass
  1329. #
  1330. # f1 = Foo()
  1331. #
  1332. # f1() # 报错,TypeError: 'Foo' object is not callable; 说明f1()是可以被执行的
  1333. #
  1334. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1335. # # Traceback (most recent call last):
  1336. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 1630, in <module>
  1337. # # f1() # 报错,TypeError: 'Foo' object is not callable; 说明f1()是可以被执行的
  1338. # # TypeError: 'Foo' object is not callable
  1339. # #
  1340. # # Process finished with exit code 1
  1341.  
  1342. '''
  1343. # ------------------------------------------------------------
  1344. # # 28.1、__call__ 演示
  1345. # ------------------------------------------------------------
  1346. '''
  1347. #
  1348. # class Foo:
  1349. # def __call__(self, *args, **kwargs):
  1350. # print("我是__call__,我执行了!!")
  1351. #
  1352. # f1 = Foo()
  1353. #
  1354. # f1() # f1的类Foo 下的__call__
  1355. #
  1356. # Foo() # Foo的类 xxx下的__call__
  1357. #
  1358. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1359. # # 我是__call__,我执行了!!
  1360. # #
  1361. # # Process finished with exit code 0
  1362.  
  1363. # ------------------------------------------------分割线-------------------------------------------------
  1364. # 13 迭代器协议
  1365. # 13 迭代器协议
  1366.  
  1367. '''
  1368. # ------------------------------------------------------------
  1369. # # 29、迭代器的协议的引入
  1370. # # # (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,
  1371. # # # 调用了他们内部的__iter__方法,把他们变成了可迭代对象; 而下面的类中,是一个对象,但是
  1372. # # # 并不是一个可迭代对象
  1373. # ------------------------------------------------------------
  1374. '''
  1375. #
  1376. # class Foo:
  1377. # pass
  1378. #
  1379. # l = list("hello")
  1380. # for i in l:
  1381. # print(i)
  1382. #
  1383. # f1 = Foo()
  1384. #
  1385. # for i in f1: # TypeError: 'Foo' object is not iterable
  1386. # print(i)
  1387. #
  1388. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1389. # # Traceback (most recent call last):
  1390. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 1700, in <module>
  1391. # # h
  1392. # # e
  1393. # # l
  1394. # # l
  1395. # # o
  1396. # # for i in f1:
  1397. # # TypeError: 'Foo' object is not iterable
  1398. # #
  1399. # # Process finished with exit code 1
  1400.  
  1401. '''
  1402. # ------------------------------------------------------------
  1403. # # 30、迭代器的协议
  1404. # # # (字符串,列表,元组,字典,集合,文件对象)这些都不是可迭代对象,只不过在for循环式,
  1405. # # # 调用了他们内部的__iter__方法,把他们变成了可迭代对象;
  1406. # # # 而下面的类中,是一个对象,在类中引入iter与next使它变成一个选代器
  1407. # ------------------------------------------------------------
  1408. '''
  1409. #
  1410. # class Foo:
  1411. # def __init__(self, n ):
  1412. # self.n = n
  1413. #
  1414. # def __iter__(self):
  1415. # return self
  1416. #
  1417. # def __next__(self):
  1418. # if self.n == 13:
  1419. # raise StopIteration("运行终止")
  1420. # self.n +=1
  1421. # return self.n
  1422. #
  1423. # l = list("hello")
  1424. # for i in l:
  1425. # print(i)
  1426. #
  1427. # print("分割线".center(100,"-"))
  1428. # f1 = Foo(10)
  1429. # for i in f1:
  1430. # print(i)
  1431. #
  1432. # print("分割线".center(100,"-"))
  1433. # f2 = Foo(8)
  1434. # print(f2.__next__(), next(f2))
  1435. #
  1436. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1437. # # h
  1438. # # e
  1439. # # l
  1440. # # l
  1441. # # o
  1442. # # ------------------------------------------------分割线-------------------------------------------------
  1443. # # 11
  1444. # # 12
  1445. # # 13
  1446. # # ------------------------------------------------分割线-------------------------------------------------
  1447. # # 9 10
  1448. # #
  1449. # # Process finished with exit code 0
  1450.  
  1451. # ------------------------------------------------分割线-------------------------------------------------
  1452. # 30 迭代器协议实现斐波那契数列
  1453. # 30 迭代器协议实现斐波那契数列
  1454.  
  1455. '''
  1456. # ------------------------------------------------------------
  1457. # # 30.1、迭代器协议实现斐波那契数列
  1458. # # # 斐波那契数列: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233...
  1459. # # #
  1460. # ------------------------------------------------------------
  1461. '''
  1462. #
  1463. # class Fib:
  1464. # def __init__(self):
  1465. # self._a = 1
  1466. # self._b = 1
  1467. #
  1468. # def __iter__(self):
  1469. # return self
  1470. #
  1471. # def __next__(self):
  1472. # if self._a > 10:
  1473. # raise StopIteration("终止了!")
  1474. # '''
  1475. # tmp = self._a
  1476. # self._a = self._b
  1477. # self._b = tmp + self._b
  1478. # 使用python的等价简洁表达方式如下
  1479. #
  1480. # '''
  1481. # self._a, self._b = self._b, self._a + self._b
  1482. # return self._a
  1483. #
  1484. # f1 = Fib()
  1485. # f2 = Fib()
  1486. #
  1487. # for i in f1:
  1488. # print(i,end=' ')
  1489. #
  1490. # print("\n")
  1491. # print(f2.__next__(), next(f2), next(f2), next(f2), next(f2), next(f2))
  1492. # next(f2)
  1493. #
  1494. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1495. # # 1 2 3 5 8 13
  1496. # #
  1497. # # 1 2 3 5 8 13
  1498. # # Traceback (most recent call last):
  1499. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 1823, in <module>
  1500. # # next(f2)
  1501. # # File "D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py", line 1804, in __next__
  1502. # # raise StopIteration("终止了!")
  1503. # # StopIteration: 终止了!
  1504. # #
  1505. # # Process finished with exit code 1
  1506.  
  1507. # ------------------------------------------------分割线-------------------------------------------------
  1508. # day27 描述符
  1509. # day27 描述符
  1510.  
  1511. '''
  1512. # ------------------------------------------------------------
  1513. # # 31、描述符的介绍
  1514. # # # 描述符是什么:描述符本质就是一个新式类,在这个新式类中,至少实现了__get__(),__set__(),__delete__()中的一个,这也被称为描述符协议
  1515. # # #__get__():调用一个属性时,触发
  1516. # # #__set__():为一个属性赋值时,触发
  1517. # # #__delete__():采用del删除属性时,触发
  1518. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1519. # ------------------------------------------------------------
  1520. '''
  1521.  
  1522. '''
  1523. # ------------------------------------------------------------
  1524. # # 31.1、定义一个描述符
  1525. # # # 在python3中Foo是新式类,它实现了三种方法,这个类就被称作一个描述符
  1526. # ------------------------------------------------------------
  1527. '''
  1528. #
  1529. # class Foo :
  1530. # def __get__(self, instance, owner):
  1531. # pass
  1532. #
  1533. # def __set__(self, instance, value):
  1534. # pass
  1535. #
  1536. # def __delete__(self, instance):
  1537. # pass
  1538.  
  1539. '''
  1540. # ------------------------------------------------------------
  1541. # # 32、描述符与实例的关系
  1542. # # # 描述符是干什么的:描述符的作用是用来代理另外一个类的属性的(必须把描述符定义成这
  1543. # # # 个类的类属性,不能定义到构造函数中
  1544. # ------------------------------------------------------------
  1545. '''
  1546. #
  1547. # class Foo :
  1548. # ''' 这是一个描述符类 '''
  1549. # def __get__(self, instance, owner):
  1550. # print("触发get")
  1551. #
  1552. # def __set__(self, instance, value):
  1553. # print("触发set")
  1554. #
  1555. # def __delete__(self, instance):
  1556. # print("触发delete")
  1557. #
  1558. #
  1559. # # 包含这三个方法的新式类称为描述符,由这个类产生的实例进行属性的调用/赋值/删除,
  1560. # # 并不会触发这三个方法
  1561. # f1 = Foo()
  1562. # print(f1.__dict__
  1563. # )
  1564. # f1.name = 'egon'
  1565. # f1.age = 22
  1566. # f1.name
  1567. # del f1.name
  1568. #
  1569. # print(f1.__dict__)
  1570. #
  1571. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1572. # # {}
  1573. # # {'age': 22}
  1574. # #
  1575. # # Process finished with exit code 0
  1576.  
  1577. '''
  1578. # ------------------------------------------------------------
  1579. # # 33、描述符的的使用
  1580. # # # 注意到,下面的实例的数值数属是 类级别的
  1581. # ------------------------------------------------------------
  1582. '''
  1583. #
  1584. # # 描述符Str
  1585. # class Str:
  1586. # def __get__(self, instance, owner):
  1587. # print("Str调用了get")
  1588. #
  1589. # def __set__(self, instance, value):
  1590. # print("Str调用了set")
  1591. #
  1592. # def __delete__(self, instance):
  1593. # print("Str调用了delete")
  1594. #
  1595. # # 描述符 Int
  1596. # class Int:
  1597. # def __get__(self, instance, owner):
  1598. # print("Int调用了get")
  1599. #
  1600. # def __set__(self, instance, value):
  1601. # print("Int调用了set")
  1602. #
  1603. # def __delete__(self, instance):
  1604. # print("Int调用了delete")
  1605. #
  1606. # class People:
  1607. # name = Str()
  1608. # age = Int()
  1609. # def __init__(self, name, age ):
  1610. # self.name = name
  1611. # self.age = age
  1612. #
  1613. # p1 = People("alex", 22)
  1614. # print("p1.__dict__: ", p1.__dict__)
  1615. # print("People.__dict__: ", People.__dict__)
  1616. #
  1617. # print("分割线111".center(100,"-"))
  1618. # # 描述符Str的分割线使用
  1619. # p1.name
  1620. # p1.name = 'egon'
  1621. #
  1622. # # 描述符Int的使用
  1623. # print("分割线222".center(100,"-"))
  1624. # p1.age
  1625. # p1.age = 11
  1626. #
  1627. # print("分割线333".center(100,"-"))
  1628. # print("p1.__dict__: ", p1.__dict__)
  1629. # print("People.__dict__: ", People.__dict__)
  1630. # print("p1.age: ", p1.age)
  1631. # print("p1.name: ", p1.name)
  1632. #
  1633. # del p1.name
  1634. # del p1.age
  1635. #
  1636. # print("分割线444".center(100,"-"))
  1637. # print("p1.__dict__: ", p1.__dict__)
  1638. # print("People.__dict__: ", People.__dict__)
  1639. #
  1640. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1641. # # Str调用了set
  1642. # # Int调用了set
  1643. # # p1.__dict__: {}
  1644. # # People.__dict__: {'__module__': '__main__', 'name': <__main__.Str object at 0x0000000002955EF0>, 'age': <__main__.Int object at 0x0000000002965C88>, '__init__': <function People.__init__ at 0x00000000039EF9D8>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
  1645. # # -----------------------------------------------分割线111-----------------------------------------------
  1646. # # Str调用了get
  1647. # # Str调用了set
  1648. # # -----------------------------------------------分割线222-----------------------------------------------
  1649. # # Int调用了get
  1650. # # Int调用了set
  1651. # # -----------------------------------------------分割线333-----------------------------------------------
  1652. # # p1.__dict__: {}
  1653. # # People.__dict__: {'__module__': '__main__', 'name': <__main__.Str object at 0x0000000002955EF0>, 'age': <__main__.Int object at 0x0000000002965C88>, '__init__': <function People.__init__ at 0x00000000039EF9D8>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
  1654. # # Int调用了get
  1655. # # p1.age: None
  1656. # # Str调用了get
  1657. # # p1.name: None
  1658. # # Str调用了delete
  1659. # # Int调用了delete
  1660. # # -----------------------------------------------分割线444-----------------------------------------------
  1661. # # p1.__dict__: {}
  1662. # # People.__dict__: {'__module__': '__main__', 'name': <__main__.Str object at 0x0000000002955EF0>, 'age': <__main__.Int object at 0x0000000002965C88>, '__init__': <function People.__init__ at 0x00000000039EF9D8>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
  1663. # #
  1664. # # Process finished with exit code 0
  1665.  
  1666. '''
  1667. # ------------------------------------------------------------
  1668. # # 33.1、含有描述符的实例与类的关系
  1669. # ------------------------------------------------------------
  1670. '''
  1671. #
  1672. # # 描述符Str
  1673. # class Str:
  1674. # def __get__(self, instance, owner):
  1675. # print("Str调用了get")
  1676. #
  1677. # def __set__(self, instance, value):
  1678. # print("Str调用了set")
  1679. #
  1680. # def __delete__(self, instance):
  1681. # print("Str调用了delete")
  1682. #
  1683. # # 描述符 Int
  1684. # class Int:
  1685. # def __get__(self, instance, owner):
  1686. # print("Int调用了get")
  1687. #
  1688. # def __set__(self, instance, value):
  1689. # print("Int调用了set")
  1690. #
  1691. # def __delete__(self, instance):
  1692. # print("Int调用了delete")
  1693. #
  1694. # class People:
  1695. # name = Str()
  1696. # age = Int()
  1697. # def __init__(self, name, age ):
  1698. # self.name = name
  1699. # self.age = age
  1700. #
  1701. #
  1702. # p1 = People("alex", 22)
  1703. #
  1704. # print("分割线11".center(100,"-"))
  1705. # print("p1.__dict__: ", p1.__dict__)
  1706. # print("People.__dict__: ", People.__dict__)
  1707. #
  1708. # print("分割线22".center(100,"-"))
  1709. # print("type(p1): ", type(p1)) # type(obj)其实是查看obj是由哪个类实例化来的
  1710. # print(type(p1) == People)
  1711. # print(type(p1).__dict__ == People.__dict__) # 被修饰后,p1的字典是等价于类的
  1712. #
  1713. #
  1714. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1715. # # Str调用了set
  1716. # # Int调用了set
  1717. # # -----------------------------------------------分割线11------------------------------------------------
  1718. # # p1.__dict__: {}
  1719. # # People.__dict__: {'__module__': '__main__', 'name': <__main__.Str object at 0x000000000295A438>, 'age': <__main__.Int object at 0x0000000002965BE0>, '__init__': <function People.__init__ at 0x00000000039EF9D8>, '__dict__': <attribute '__dict__' of 'People' objects>, '__weakref__': <attribute '__weakref__' of 'People' objects>, '__doc__': None}
  1720. # # -----------------------------------------------分割线22------------------------------------------------
  1721. # # type(p1): <class '__main__.People'>
  1722. # # True
  1723. # # True
  1724. # #
  1725. # # Process finished with exit code 0
  1726.  
  1727. '''
  1728. # ------------------------------------------------------------
  1729. # # 34、描述符之一,数据描述符
  1730. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1731. # # # 一 数据描述符:至少实现了__get__()和__set__()
  1732. # ------------------------------------------------------------
  1733. '''
  1734. #
  1735. # class Foo:
  1736. # def __set__(self, instance, value):
  1737. # print("set")
  1738. #
  1739. # def __get__(self, instance, owner):
  1740. # print("get")
  1741. #
  1742.  
  1743. '''
  1744. # ------------------------------------------------------------
  1745. # # 35、描述符之二,非数据描述符
  1746. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1747. # # # 二 非数据描述符:没有实现__set__()
  1748. # ------------------------------------------------------------
  1749. '''
  1750. #
  1751. # class Foo:
  1752. # def __get__(self, instance, owner):
  1753. # print("get")
  1754. #
  1755.  
  1756. '''
  1757. # ------------------------------------------------------------
  1758. # # 36、描述符之优先级别,类属性>数据描述
  1759. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1760. # # # 二 非数据描述符:没有实现__set__()
  1761. # ------------------------------------------------------------
  1762. '''
  1763. #
  1764. # #描述符Str
  1765. # class Str:
  1766. # def __get__(self, instance, owner):
  1767. # print('Str调用')
  1768. # def __set__(self, instance, value):
  1769. # print('Str设置...')
  1770. # def __delete__(self, instance):
  1771. # print('Str删除...')
  1772. #
  1773. # # 描述符 Int
  1774. # class Int:
  1775. # def __get__(self, instance, owner):
  1776. # print("Int调用了get")
  1777. #
  1778. # def __set__(self, instance, value):
  1779. # print("Int调用了set")
  1780. #
  1781. # def __delete__(self, instance):
  1782. # print("Int调用了delete")
  1783. #
  1784. # class People:
  1785. # name=Str()
  1786. # age = Int()
  1787. # def __init__(self,name,age): #name被Str类代理,age被Int类代理,
  1788. # self.name=name
  1789. # self.age=age
  1790. #
  1791. #
  1792. # #基于上面的演示,我们已经知道,在一个类中定义描述符它就是一个类属性,存在于类的属性字典中,而不是实例的属性字典
  1793. #
  1794. # #那既然描述符被定义成了一个类属性,直接通过类名也一定可以调用吧,没错
  1795. # People.name # 恩,调用类属性name,本质就是在调用描述符Str,触发了__get__()
  1796. #
  1797. # People.name='egon' #那赋值呢,我去,并没有触发__set__()
  1798. # del People.name #赶紧试试del,我去,也没有触发__delete__()
  1799. # # 结论:描述符对类没有作用-------->傻逼到家的结论
  1800. #
  1801. '''
  1802. 原因:描述符在使用时被定义成另外一个类的类属性,因而类属性比二次加工的描述符伪装而来的类属性有更高的优先级
  1803. People.name #恩,调用类属性name,找不到就去找描述符伪装的类属性name,触发了__get__()
  1804.  
  1805. People.name='egon' #那赋值呢,直接赋值了一个类属性,它拥有更高的优先级,相当于覆盖了描述符,肯定不会触发描述符的__set__()
  1806. del People.name #同上
  1807. '''
  1808. #
  1809. #
  1810. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1811. # # Str调用
  1812. # #
  1813. # # Process finished with exit code 0
  1814.  
  1815. '''
  1816. # ------------------------------------------------------------
  1817. # # 36.1、描述符之优先级别,类属性>数据描述
  1818. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1819. # # # 二 非数据描述符:没有实现__set__()
  1820. # ------------------------------------------------------------
  1821. '''
  1822. #
  1823. # # 描述符Str
  1824. # class Str:
  1825. # def __get__(self, instance, owner):
  1826. # print('Str调用')
  1827. #
  1828. # def __set__(self, instance, value):
  1829. # print('Str设置...')
  1830. #
  1831. # def __delete__(self, instance):
  1832. # print('Str删除...')
  1833. #
  1834. #
  1835. # class People:
  1836. # name=Str()
  1837. #
  1838. # def __init__(self,name,age): # name被Str类代理
  1839. # self.name=name
  1840. # self.age=age
  1841. #
  1842. #
  1843. # p1=People('egon',18)
  1844. #
  1845. # print("分割线11".center(100,"-"))
  1846. # # 如果描述符是一个数据描述符(即有__get__又有__set__),那么p1.name的调用与赋值都是触发
  1847. # # 描述符的操作,于p1本身无关了,相当于覆盖了实例的属性
  1848. # p1.name='egonnnnnn'
  1849. #
  1850. # print("分割线22".center(100,"-"))
  1851. # p1.name
  1852. #
  1853. # print("分割线33".center(100,"-"))
  1854. # # 实例的属性字典中没有name,因为name是一个数据描述符,优先级高于实例属性,查看/赋值/删除都是
  1855. # # 跟描述符有关,与实例无关了
  1856. # print(p1.__dict__)
  1857. # del p1.name
  1858. #
  1859. # # D:\Anaconda3\python.exe D:/C_cache/py/cache.py
  1860. # # Str设置...
  1861. # # -----------------------------------------------分割线11------------------------------------------------
  1862. # # Str设置...
  1863. # # -----------------------------------------------分割线22------------------------------------------------
  1864. # # Str调用
  1865. # # -----------------------------------------------分割线33------------------------------------------------
  1866. # # {'age': 18}
  1867. # # Str删除...
  1868. # #
  1869. # # Process finished with exit code 0
  1870.  
  1871. '''
  1872. # ------------------------------------------------------------
  1873. # # 36.1.1、描述符之优先级别,类属性>数据描述
  1874. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1875. # # # 二 非数据描述符:没有实现__set__()
  1876. # ------------------------------------------------------------
  1877. '''
  1878. #
  1879. # # 描述符Str
  1880. # class Str:
  1881. # def __get__(self, instance, owner):
  1882. # print('Str调用')
  1883. #
  1884. # # def __set__(self, instance, value):
  1885. # # print('Str设置...')
  1886. # #
  1887. # # def __delete__(self, instance):
  1888. # # print('Str删除...')
  1889. #
  1890. #
  1891. # class People:
  1892. # name = Str()
  1893. #
  1894. # def __init__(self, name, age): # name被Str类代理,
  1895. # self.name = name
  1896. # self.age = age
  1897. #
  1898. #
  1899. # p1 = People('egon', 18)
  1900. #
  1901. # # 如果描述符是一个数据描述符(即有__get__又有__set__),那么p1.name的调用与赋值都是触发
  1902. # # 描述符的操作,于p1本身无关了,相当于覆盖了实例的属性;
  1903. # # 如果只有__get__的话,那么就是不会触发描述符, 进行的赋值操作会对实例的字典进行操作
  1904. # p1.name = 'egonnnnnn'
  1905. # p1.name
  1906. # print(p1.__dict__) # 实例的属性字典中没有name,因为name是一个数据描述符,优先级高于实例属性,查看/赋值/删除都是跟描述符有关,与实例无关了
  1907. # del p1.name
  1908. #
  1909. #
  1910. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1911. # # Str设置...
  1912. # # Str设置...
  1913. # # Str调用
  1914. # # {'age': 18}
  1915. # # Str删除...
  1916. # #
  1917. # # Process finished with exit code 0
  1918. #
  1919.  
  1920. '''
  1921. # ------------------------------------------------------------
  1922. # # 36.2、描述符之优先级别,实例属性>非数据描述符
  1923. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1924. # # # 二 非数据描述符:没有实现__set__()
  1925. # ------------------------------------------------------------
  1926. '''
  1927. #
  1928. # class Foo:
  1929. # def func(self):
  1930. # print('我胡汉三又回来了')
  1931. #
  1932. #
  1933. # f1 = Foo()
  1934. # f1.func() # 调用类的方法,也可以说是调用非数据描述符
  1935. # # 函数是一个非数据描述符对象(一切皆对象么)
  1936. #
  1937. # print("分割线11".center(100,"-"))
  1938. # print(dir(Foo.func))
  1939. # print(hasattr(Foo.func, '__set__'))
  1940. # print(hasattr(Foo.func, '__get__'))
  1941. # print(hasattr(Foo.func, '__delete__'))
  1942. # # 有人可能会问,描述符不都是类么,函数怎么算也应该是一个对象啊,怎么就是描述符了
  1943. # # 笨蛋哥,描述符是类没问题,描述符在应用的时候不都是实例化成一个类属性么
  1944. # # 函数就是一个由非描述符类实例化得到的对象
  1945. # # 没错,字符串也一样
  1946. #
  1947. # print("分割线22".center(100,"-"))
  1948. # print("Foo.__dict__: ", Foo.__dict__)
  1949. # print("f1.__dict__: ", f1.__dict__)
  1950. #
  1951. # print("分割线33".center(100,"-"))
  1952. # # 对实例 f1 生成数据数性 func; 注意,类中有一个己已经定义好的函数属属性 def func()
  1953. # f1.func = '这是实例属性啊'
  1954. # # =========>>>>>>这里,类的属性与实例中,都是func;
  1955. # # =========>>>>>>不过类中的是非数据属性,实例中的是数据属性
  1956. # print(f1.func)
  1957. #
  1958. # print("分割线44".center(100,"-"))
  1959. # print("Foo.__dict__: ", Foo.__dict__) # 'func': <function Foo.func at 0x0000000001CF1EA0>,
  1960. # print("f1.__dict__: ", f1.__dict__) # {'func': '这是实例属性啊'}
  1961. #
  1962. # print("分割线55".center(100,"-"))
  1963. # del f1.func # 删掉了非数据
  1964. # f1.func()
  1965. #
  1966. # print("分割线66".center(100,"-"))
  1967. # print("Foo.__dict__: ", Foo.__dict__)
  1968. # print("f1.__dict__: ", f1.__dict__)
  1969. #
  1970. #
  1971. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  1972. # # 我胡汉三又回来了
  1973. # # -----------------------------------------------分割线11------------------------------------------------
  1974. # # ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
  1975. # # False
  1976. # # True
  1977. # # False
  1978. # # -----------------------------------------------分割线22------------------------------------------------
  1979. # # Foo.__dict__: {'__module__': '__main__', 'func': <function Foo.func at 0x0000000001D11EA0>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  1980. # # f1.__dict__: {}
  1981. # # -----------------------------------------------分割线33------------------------------------------------
  1982. # # 这是实例属性啊
  1983. # # -----------------------------------------------分割线44------------------------------------------------
  1984. # # Foo.__dict__: {'__module__': '__main__', 'func': <function Foo.func at 0x0000000001D11EA0>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  1985. # # f1.__dict__: {'func': '这是实例属性啊'}
  1986. # # -----------------------------------------------分割线55------------------------------------------------
  1987. # # 我胡汉三又回来了
  1988. # # -----------------------------------------------分割线66------------------------------------------------
  1989. # # Foo.__dict__: {'__module__': '__main__', 'func': <function Foo.func at 0x0000000001D11EA0>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  1990. # # f1.__dict__: {}
  1991. # #
  1992. # # Process finished with exit code 0
  1993. #
  1994.  
  1995. '''
  1996. # ------------------------------------------------------------
  1997. # # 36.3、描述符之优先级别,实例属性>非数据描述符( 再次验证1 )
  1998. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  1999. # # # 二 非数据描述符:没有实现__set__()
  2000. # ------------------------------------------------------------
  2001. '''
  2002. #
  2003. # class Foo:
  2004. #
  2005. # def __set__(self, instance, value):
  2006. # '''
  2007. #
  2008. # :param instance: r1,所修饰的对象中所产生的寮例 <__main__.Room object at 0x00000000029A5F28>
  2009. # :param value: '厕所'
  2010. # :return:
  2011. # '''
  2012. # print('【set】')
  2013. # print('==>>self', self) # <__main__.Foo object at 0x000000000210C278>
  2014. # print('==>>instance', instance) # r1,<__main__.Room object at 0x00000000029A5F28>
  2015. # print('==>>value', value) # '厕所'
  2016. #
  2017. # def __get__(self, instance, owner):
  2018. # print('【get】')
  2019. #
  2020. #
  2021. # class Room:
  2022. # name = Foo() # 相当于对Foo过行了实例化,Foo的括号默认传入 self.name
  2023. #
  2024. # def __init__(self, name, width, length):
  2025. # self.name = name
  2026. # self.width = width
  2027. # self.length = length
  2028. #
  2029. #
  2030. # # name是一个数据描述符,因为name=Foo()而Foo实现了get和set方法,因而比实例属性有更高的优先级
  2031. # # 对实例的属性操作,触发的都是描述符的
  2032. #
  2033. # r1 = Room('厕所', 1, 1)
  2034. #
  2035. # print("分割线111".center(100,"-"))
  2036. # print("Room.__dict__: ", Room.__dict__)
  2037. # print("r1.__dict__: ", r1.__dict__)
  2038. # print("r1", r1) # r1 <__main__.Room object at 0x0000000002975C50>
  2039. #
  2040. # print("分割线222".center(100,"-"))
  2041. # print("==>>r1.name", r1.name)
  2042. # r1.name
  2043. # r1.name = '厨房'
  2044. # print("=======>>>r1.name", r1.name)
  2045. #
  2046. # print("分割线333".center(100,"-"))
  2047. # print("Room.__dict__: ", Room.__dict__)
  2048. # print("r1.__dict__: ", r1.__dict__)
  2049. #
  2050. #
  2051. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  2052. # # 【set】
  2053. # # ==>>self <__main__.Foo object at 0x00000000020CC278>
  2054. # # ==>>instance <__main__.Room object at 0x0000000002975C88>
  2055. # # ==>>value 厕所
  2056. # # -----------------------------------------------分割线111-----------------------------------------------
  2057. # # Room.__dict__: {'__module__': '__main__', 'name': <__main__.Foo object at 0x00000000020CC278>, '__init__': <function Room.__init__ at 0x00000000039EF7B8>, '__dict__': <attribute '__dict__' of 'Room' objects>, '__weakref__': <attribute '__weakref__' of 'Room' objects>, '__doc__': None}
  2058. # # r1.__dict__: {'width': 1, 'length': 1}
  2059. # # r1 <__main__.Room object at 0x0000000002975C88>
  2060. # # -----------------------------------------------分割线222-----------------------------------------------
  2061. # # 【get】
  2062. # # ==>>r1.name None
  2063. # # 【get】
  2064. # # 【set】
  2065. # # ==>>self <__main__.Foo object at 0x00000000020CC278>
  2066. # # ==>>instance <__main__.Room object at 0x0000000002975C88>
  2067. # # ==>>value 厨房
  2068. # # 【get】
  2069. # # =======>>>r1.name None
  2070. # # -----------------------------------------------分割线333-----------------------------------------------
  2071. # # Room.__dict__: {'__module__': '__main__', 'name': <__main__.Foo object at 0x00000000020CC278>, '__init__': <function Room.__init__ at 0x00000000039EF7B8>, '__dict__': <attribute '__dict__' of 'Room' objects>, '__weakref__': <attribute '__weakref__' of 'Room' objects>, '__doc__': None}
  2072. # # r1.__dict__: {'width': 1, 'length': 1}
  2073. # #
  2074. # # Process finished with exit code 0
  2075.  
  2076. '''
  2077. # ------------------------------------------------------------
  2078. # # 36.4、描述符之优先级别,实例属性>非数据描述符( 再次验证2 )
  2079. # # # 描述符分两种,一:数据描述符; 二:非数据描述符
  2080. # # # 二 非数据描述符:没有实现__set__()
  2081. # ------------------------------------------------------------
  2082. '''
  2083.  
  2084. #
  2085. # class Foo:
  2086. # def __get__(self, instance, owner):
  2087. # print('get')
  2088. #
  2089. #
  2090. # class Room:
  2091. # name = Foo()
  2092. #
  2093. # def __init__(self, name, width, length):
  2094. # self.name = name
  2095. # self.width = width
  2096. # self.length = length
  2097. #
  2098. #
  2099. # # name是一个非数据描述符,因为name=Foo()而Foo没有实现set方法,因而比实例属性有更低的优先级
  2100. # # 对实例的属性操作,触发的都是实例自己的
  2101. # r1 = Room('厕所', 1, 1)
  2102. #
  2103. # print("分割线".center(100,"-"))
  2104. # print("Foo.__dict__: ", Foo.__dict__)
  2105. # print("r1.__dict__: ", r1.__dict__)
  2106. #
  2107. # print("分割线".center(100,"-"))
  2108. # r1.name
  2109. # r1.name = '厨房'
  2110. #
  2111. # print("Foo.__dict__: ", Foo.__dict__)
  2112. # print("r1.__dict__: ", r1.__dict__)
  2113. #
  2114. # # D:\Anaconda3\python.exe D:/C_cache/py/cache.py
  2115. # # ------------------------------------------------分割线-------------------------------------------------
  2116. # # Foo.__dict__: {'__module__': '__main__', '__get__': <function Foo.__get__ at 0x00000000023A3620>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  2117. # # r1.__dict__: {'name': '厕所', 'width': 1, 'length': 1}
  2118. # # ------------------------------------------------分割线-------------------------------------------------
  2119. # # Foo.__dict__: {'__module__': '__main__', '__get__': <function Foo.__get__ at 0x00000000023A3620>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None}
  2120. # # r1.__dict__: {'name': '厨房', 'width': 1, 'length': 1}
  2121. # #
  2122. # # Process finished with exit code 0
  2123. #
  2124.  
  2125. '''
  2126. # ------------------------------------------------------------
  2127. # # 37、非数据描述符>找不到
  2128. # ------------------------------------------------------------
  2129. '''
  2130. #
  2131. # class Foo:
  2132. # def func(self):
  2133. # print("我回来了")
  2134. #
  2135. # def __getattr__(self, item):
  2136. # print("找不到了当然就来找我啦", item)
  2137. #
  2138. # f1 = Foo()
  2139. # f1.func()
  2140. # f1.xxxxxxx
  2141. # #
  2142. # # D:\Anaconda3\python.exe D:/C_cache/py/cache.py
  2143. # # 我回来了
  2144. # # 找不到了当然就来找我啦 xxxxxxx
  2145. # #
  2146. # # Process finished with exit code 0
  2147.  
  2148. '''
  2149. # ------------------------------------------------------------
  2150. # # 38、不同目录级别下的文件路径处理1
  2151. # # # 注:下面的这种方式的文件路径是没有处理的主,不建 讠义 使用;
  2152. 运行的路径如下:
  2153. D:\C_cache\py\day27_MianXiangDuiXiangJinJie\bin\bin.py
  2154.  
  2155. lib.aa.py的路径如下:
  2156. D:\C_cache\py\day27_MianXiangDuiXiangJinJie\lib\aa.py
  2157.  
  2158. aa.py的内容如下:
  2159. def info():
  2160. print("我是aa.py文件,欢迎来到到这里呀")
  2161. # ------------------------------------------------------------
  2162. '''
  2163. #
  2164. # # 在 pycharm编译器 中,它会自动帮你把文件路径进行处理,因为在建立工程项目文件的时候,pycharm
  2165. # # 会自动帮你把工程的文件路径加入运行的环境变量(sys.path)中,因此下面的运行时不会有
  2166. # # 任何的问题,但是到了 命令终端 之后,就会报错!因为运行的环境变量没有改变,找不到aa.py文件
  2167. # # 在命令终端的查找的过程如下:
  2168. # # bin 目录下找lib 目录下的 aa.py —> 没有 -->报错
  2169. # # 在pycharm编译器中查找的过程如下:
  2170. # # bin 目录下找lib 目录下的 aa.py —> 没有 --> sys.path查找 --> 找到lib下的aa.py(建立工程的时候pychar自动把工程下的文件路径加入运行的环境变量中)
  2171. #
  2172. # from lib import aa
  2173. # aa.info()
  2174. #
  2175. #
  2176. # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  2177. # 我是aa.py文件,欢迎来到到这里呀
  2178. #
  2179. # Process finished with exit code 0
  2180.  
  2181. '''
  2182. # ------------------------------------------------------------
  2183. # # 38.1、不同目录级别下的文件路径处理2
  2184. # # # 注:下面的这种方式的文件路径是进行了处理,建 讠义 使用;这样,当工程文件的拷贝到了不同的止录下,
  2185. # # # 都是可以使用的
  2186.  
  2187. 运行的路径如下:
  2188. D:\C_cache\py\day27_MianXiangDuiXiangJinJie\bin\bin.py
  2189.  
  2190. lib.aa.py的路径如下:
  2191. D:\C_cache\py\day27_MianXiangDuiXiangJinJie\lib\aa.py
  2192.  
  2193. aa.py的内容如下:
  2194. def info():
  2195. print("我是aa.py文件,欢迎来到到这里呀")
  2196. # ------------------------------------------------------------
  2197. '''
  2198. #
  2199. # # 在pycharm编译器中,它会自动帮你把文件路径进行处理因此下面的运行时不会有任何的问题,但是到了
  2200. # # 命令终端之后,就会报错!因为运行的环境变量没有改变,找不到aa.py文件
  2201. # import os, sys
  2202. # BASE_DIR = os.path.dirname(os.path.dirname(__file__))
  2203. # # print(BASE_DIR)
  2204. # sys.path.append(BASE_DIR)
  2205. # from lib import aa
  2206. # aa.info()
  2207. #
  2208. # # D:\Anaconda3\python.exe D:/C_cache/py/day27_MianXiangDuiXiangJinJie/day27_MianXiangDuiXiangJinJie.py
  2209. # # 我是aa.py文件,欢迎来到到这里呀
  2210. # #
  2211. # # Process finished with exit code 0

  

  1.  

day27-面向对象进阶的更多相关文章

  1. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  2. day26、面向对象进阶:多态、封装、反射

    一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...

  3. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  4. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

  5. python基础——面向对象进阶

    python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...

  6. 周末班:Python基础之面向对象进阶

    面向对象进阶 类型判断 issubclass 首先,我们先看issubclass() 这个内置函数可以帮我们判断x类是否是y类型的子类. class Base: pass class Foo(Base ...

  7. Python面向对象进阶和socket网络编程-day08

    写在前面 上课第八天,打卡: 为什么坚持?想一想当初: 一.面向对象进阶 - 1.反射补充 - 通过字符串去操作一个对象的属性,称之为反射: - 示例1: class Chinese: def __i ...

  8. 铁乐学python_day24_面向对象进阶1_内置方法

    铁乐学python_day24_面向对象进阶1_内置方法 题外话1: 学习方法[wwwh] what where why how 是什么,用在哪里,为什么,怎么用 学习到一个新知识点的时候,多问问上面 ...

  9. 铁乐学python_day23_面向对象进阶1_反射

    铁乐学python_day23_面向对象进阶1_反射 以下内容大部分摘自博客http://www.cnblogs.com/Eva-J/ isinstance()和issubclass() 两者的返回值 ...

  10. python学习之老男孩python全栈第九期_day028知识点总结——面向对象进阶、hashlib

    一. 面向对象进阶与实例 dic = {'k': 'v' } 对象:存储 属性 和 调用方法 dic['k'] = 'v' class Foo: def __init__(self, name, ag ...

随机推荐

  1. Ubuntu 18.04 安装 python3.7

    Ubuntu 18.04系统内置了Python 3.6和Python 2.7版本,以下是在Ubuntu 18.04系统中安装Python 3.7版本的方法. 1. 执行所有升级# sudo apt u ...

  2. bzoj1001 [ICPC-Beijing 2006]狼抓兔子

    我满心以为本题正解为最短路,结果到处都是最大流…… 几乎所有的都写了什么“对偶图”跑最短路,但我真的不知道什么叫做对偶图---------------------------------------- ...

  3. BZOJ 4319: cerc2008 Suffix reconstruction(后缀数组)

    题面 Description 话说练习后缀数组时,小C 刷遍 poj 后缀数组题, 各类字符串题闻之丧胆.就在准备对敌方武将发出连环杀时,对方一记无中生有,又一招顺 手牵羊,小C 程序中的原字符数组就 ...

  4. fiddler对浏览器、app抓包及证书安装

    1.fiddler对浏览器抓包 1.1 对浏览器的http的抓包 Capturing开启,进行抓包: Capturing关闭,停止抓包: 如下图:  1.2 对浏览器的https抓包 1.2.1 开启 ...

  5. Rubber Ducky简介

    USB Rubber Ducky是一款模仿人工键盘输入的设备,外形和U盘一样,模拟键盘输入速度可达到1000个字符每分钟,并且适合任何操作系统,包括安卓等移动OS,它使用的是它特定的脚本语言,用记事本 ...

  6. elipse手机设备显示Target unknown或者offline解决方法

    参考资料: http://blog.csdn.net/yuanjingjiang/article/details/11297433 http://www.educity.cn/wenda/153487 ...

  7. 剑指offer---1、顺时针打印矩阵

    剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...

  8. fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库

    问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化  将这里的默认项 "使用链接时间代码生成& ...

  9. [转] Linux下编写脚本实现Daemon

    在Linux(以Redhat Linux Enterprise Edition 5.3为例)下,有时需要编写Service.Service也是程序,一般随系统启动用户不干预就不退出的程序,可以称为Se ...

  10. jeecg 实现lhgDialog窗口传值

    需要在jeecg中的dialog弹框往调用的窗口赋值. 定义内容页调用窗体实例对象接口 var windowapi = frameElement.api ; var W = windowapi.ope ...