(1)一般性继承特性

  1. """
  2. 该文件对于python 3.x 及python 2.x的New-style 类的一般性继承特性进行了说明和测试。
  3. (1)实例的继承特性:搜寻实例,类,超类:
  4. a.搜寻该实例的__class__(即该实例的类)的__mro__中的所有类的__dict__
  5. b.如果在步骤a中,第一个找到的是相应的数据描述符,则调用并退出(找到后仅判断是否为描述符,不再继续往后找)
  6. c.否则,如果不是数据描述符,返回实例的__dict__中的值
  7. d.否则,实例__dict__没有,调用在a中找到的非数据描述符,或者返回在a中找到的值
  8. (2)类的继承特性:搜寻类,超类,元类:
  9. a.搜寻该类的__class__(即该类的元类)的__mro__中所有元类的__dict__
  10. b.如果在步骤a中,第一个找到的相应的数据描述符,则调用并退出(找到后仅判断是否为描述符,不再继续往后找)
  11. c.否则,如果不是数据描述符,调用或返回在该类自己的__mro__中所有类的__dict__中的第一个找到的描述符或值
  12. d.否则,调用在a中找到的非数据描述符,或者返回在a中找到的值
  13.  
  14. 对于赋值继承,实例继承从上述a到c,不过b步骤改为__set__方法,c步骤为在继承里存储
  15. 类继承与一般性继承特性一致,只有c步骤改为停止,储存
  16. """
  17. class desc: #数据描述符
  18. def __get__(self,instance,owner):
  19. return ('datadesc getting!')
  20. def __set__(self,instance,value):
  21. print ('datadesc setting!',value)
  22. class Nondatadesc: #非数据描述符
  23. def __get__(self,instance,owner):
  24. return ('Nondatadesc getting')
  25. class a(type):
  26. data1=desc() #类继承,第一个找到数据描述符
  27. data2='only located in metaclass a' #类继承,因为第一个找到的是该处,而该处又非数据描述符,而该类基类__dict__中又无,故返回该值
  28. data10=Nondatadesc() #类继承,找到非数据描述符,同上,最终返回该值
  29. data11=Nondatadesc() #类继承,第一个找到该处,但非数据描述符,在step c中,找到data11,故此处被截断
  30. class b:
  31. data1='b1' #类继承,其值被描述符截断
  32. data3=desc() #类继承,超类中找到的值
  33. def __init__(self):
  34. self.data8='cannot be found' #实例继承找不到该值,因为不在实例类的超类的__dict__中
  35. data5='b5' #实例继承,被前面的d中的描述符截断
  36. data7='found in superclass b' #实例继承,返回仅能在b中找到的值
  37. data6=desc() #实例继承,于其类的超类中找到的数据描述符
  38. data9='being intercepted by a.data9' #实例继承,a中无描述符
  39. data11='Fetched before data11 in class a' #类继承,step c 返回该值,截断元类
  40. data12=Nondatadesc() #实例继承中,最终返回非数据描述符
  41. class d:
  42. data1='d1'
  43. data6='being found prior to b,so interceptting b"s desc' #实例继承中,第一次找到,但不是desc,进入step c,实例中没有data6,故最终返回该值
  44. data5=desc() #实例继承中,第一次找到的data5是描述符
  45. data3='First meet d,so interceptting b"s desc' #类继承中,第一次找到的daa3,不是
  46.  
  47. class c(d,b,metaclass=a):
  48. data1='c1' #类继承中,其值被描述符截断
  49. data4='located in class c' #实例继承,于其类中找到值
  50. def __init__(self):
  51. self.data9='instance dict' #实例继承步骤c中找到该值
  52. # self.data5='instance data5'
  53.  
  54. print('Test Starting'.center(50,'-'))
  55. import sys
  56. print('sys.verson=',sys.version)
  57. print('实例继承测试'.center(50,'*'))
  58. x=c()
  59. print('x.data5',x.data5)
  60. print('x.data9',x.data9)
  61. print('x.data7',x.data7)
  62. print('x.data6',x.data6)
  63. print('x.data12',x.data12)
  64. x.data5=1 #触发__set__方法
  65. x.data9=2
  66. # print('set x.data5=1->',x.data5)
  67. # x.data9=2
  68. # print('set x.data9=2->',x.data9)
  69. try:
  70. x.data8
  71. except AttributeError:
  72. print('impossible fetch')
  73. print('实例搜索路径'.center(50,'*'))
  74. for cls in x.__class__.__mro__:
  75. for attr in cls.__dict__:
  76. if not attr.startswith('__'):
  77. print('class %s--> attr %s'%(cls.__name__,attr))
  78. print('类继承测试'.center(50,'*'))
  79. print('c.data1',c.data1)
  80. print('c.data3',c.data3)
  81. print('c.data2',c.data2)
  82. print('c.data10',c.data10)
  83. print('c.data11',c.data11)
  84. c.data1=1 #触发__set__方法
  85. c.data3=3

运行后:

  1. ------------------Test Starting-------------------
  2. sys.verson= 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)]
  3. **********************实例继承测试**********************
  4. x.data5 datadesc getting!
  5. x.data9 instance dict
  6. x.data7 found in superclass b
  7. x.data6 being found prior to bso interceptting b"s desc
  8. x.data12 Nondatadesc getting
  9. datadesc setting! 1
  10. impossible fetch
  11. **********************实例搜索路径**********************
  12. class c--> attr data1
  13. class c--> attr data4
  14. class d--> attr data1
  15. class d--> attr data6
  16. class d--> attr data5
  17. class d--> attr data3
  18. class b--> attr data1
  19. class b--> attr data3
  20. class b--> attr data5
  21. class b--> attr data7
  22. class b--> attr data6
  23. class b--> attr data9
  24. class b--> attr data11
  25. class b--> attr data12
  26. **********************类继承测试***********************
  27. c.data1 datadesc getting!
  28. c.data3 First meet d,so interceptting b"s desc
  29. c.data2 only located in metaclass a
  30. c.data10 Nondatadesc getting
  31. c.data11 Fetched before data11 in class a
  32. datadesc setting! 1

(2)built-ins特殊情况

  1. """
  2. builtin 的继承特性:
  3. (1)对于实例继承:若是显式调用,则首先搜索实例,否则搜索该实例的类,否则搜索实例类的超类;
  4. 若是隐式调用,则跳过实例,首先搜索该实例的类,否则搜索该实例类的超类。
  5. (2)对于类继承:若是显示调用,则首先搜索该类,否则搜索该类的超类;
  6. 若是隐式调用,则跳过该类,首先搜索该类的元类(metaclass),否则搜索该元类的超类。
  7. 注意到2点:一是实例和类的共同点,即对于显示调用,都是从自身层搜索,然后搜索自身的继承层(实例继承层是类,
  8. 类继承层是超类;而隐式调用首先从自身的创建层(实例创建层是类,类创建层是元类),否则再搜索创建层的继承层。
  9. """
  10. class a(type):
  11. def __str__(self):
  12. return 'a'
  13. class b(type):
  14. pass
  15. class c(a):
  16. def __str__(self):
  17. return 'c'
  18. class d(metaclass=a):
  19. pass
  20. class e(metaclass=a):
  21. def __str__(self):
  22. return 'e'
  23. class f(metaclass=b):
  24. def __str__(self):
  25. return 'f'
  26. class g(c):
  27. pass
  28. class h(d,e,metaclass=g):pass
  29. print('实例显式继承'.center(50,'*'))
  30. x=h()
  31. print('x.__str__:=>',x.__str__()) #实例无_str__,类无,超类d无,超类e有,返回'e'
  32. x.__str__=lambda :'lambda'
  33. print('Having set instance x"s __str__')
  34. print('x.__str__:=>',x.__str__()) #实例有__str__
  35. print('实例隐式继承'.center(50,'*'))
  36. print('str(x)',str(x)) #从类开始搜索,然后搜类的超类,找到e
  37. print('类显式继承'.center(50,'*'))
  38. print('h.__str__(h)',h.__str__(h)) #从类开始搜索,然后搜索类的超类,找到e
  39. print('类隐式继承'.center(50,'*'))
  40. print('str(h)',str(h)) #从元类搜索,然后搜索元类的超类,找到c
  1. **********************实例显式继承**********************
  2. x.__str__:=> e
  3. Having set instance x"s __str__
  4. x.__str__:=> lambda
  5. **********************实例隐式继承**********************
  6. str(x) e
  7. **********************类显式继承***********************
  8. h.__str__(h) e
  9. **********************类隐式继承***********************
  10. str(h) c
  11. [Finished in 0.1s]
  1.  
  1.  

对于python 3.x与python2.x中新型类的继承特性总结的更多相关文章

  1. 关于Python中的类普通继承与super函数继承

    关于Python中的类普通继承与super函数继承 1.super只能用于新式类 2.多重继承super可以保公共父类仅被执行一次 一.首先看下普通继承的写法 二.再看看super继承的写法 参考链接 ...

  2. python中的类与继承

    Class 类的定义以及实例的建立 Python中,类通过 class 关键字定义. 例如最简单的一个类定义可以为: class Person(object): pass Python 的编程习惯,类 ...

  3. python 全栈开发,Day117(popup,Model类的继承,crm业务开发)

    昨日内容回顾 第一部分:权限相关 1. 权限基本流程 用户登录成功后获取权限信息,将[权限和菜单]信息写入到session. 以后用户在来访问,在中间件中进行权限校验. 为了提升用户体验友好度,在后台 ...

  4. JavaScript中的类式继承和原型式继承

    最近在看<JavaScript设计模式>这本书,虽然内容比较晦涩,但是细品才发现此书内容的强大.刚看完第四章--继承,来做下笔记. 书中介绍了三种继承方式,类式继承.原型式继承和掺元类继承 ...

  5. java中阻止类的继承

    1.使用final来修饰类 final表示这个类是继承树的末端,不能被继承. 2.将类的构造方法声明为private的,再提供一个static的方法来返回一个类的对象. JAVA语言要求继承时必须在构 ...

  6. ES6中的类和继承

    class的写法及继承 JavaScript 语言中,生成实例对象的传统方法是通过构造函数.下面是一个例子     function Point(x, y) {  this.x = x;  this. ...

  7. [Android Studio] Android Studio中查看类的继承关系

    转载自:http://blog.csdn.net/hyr83960944/article/details/38098091 查看类的继承关系的快捷键F4,在Android Studio常用快捷键这篇文 ...

  8. Android Studio中查看类的继承关系

    查看类的继承关系的快捷键F4.在Android Studio经常使用快捷键这篇文章中.有写了.今天主要是讲一些关于这个快捷键出来的界面的一些配置.这块功能相对偏冷一些,可能非常多人都会用不到.可是关于 ...

  9. ES5中的类与继承

    最近在重新复习TypeScript,看到类这块的时候自然会和ES5中的类写法进行对比加深印象. 发现ES5的类与继承一些细节还是挺多的,时间久了容易忘记,特此记录下. 首先是ES5的类定义,这没什么好 ...

随机推荐

  1. java并发AtomicIntegerFieldUpdater

    java并发AtomicIntegerFieldUpdater 支持对象的成员变量原子操作类由AtomicIntegerFieldUpdater,AtomicLongFieldUpdater, Ato ...

  2. Day8 - C - Largest Rectangle in a Histogram HDU - 1506

    A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rec ...

  3. 通过注册码破解IntelliJ IDEA

    把激活码填入下面的地方即可.如果不知道在哪里,那么就选菜单栏里的help再选Register就会弹出下面的界面 激活码网址里面有 lookdiv.com 里面的钥匙就是lookdiv.com

  4. pyhon 内置函数

    chr()   asci码 dir()  目录,显示目录. divmod(10,3)   返回商和余数   例如  (3, 1)   返回的为一个元组    可以用于分页 enumerate()    ...

  5. php 语法错误定位 try catch Throwable

    try { } catch (Exception $ex) {      // 计算错误 }  catch (Throwable $ex) { // 语法错误,致命错误 }   Throwable { ...

  6. Echarts学习宝典

    1,可以使用百度图说中的图表代码复制到option中,还可在百度图说中以可视化的方式编辑数据,调整参数和编辑样式.(也可借助百度图说更改部分样式) 2,借助网站 https://echarts.bai ...

  7. 侧边栏下拉时箭头的旋转动画(treeView控件)

    //点击菜单时箭头旋转 let treeView = document.getElementsByClassName("treeview");//let解决闭包问题 let las ...

  8. 吴裕雄--天生自然JAVA数据库编程:JDBC操作步骤及数据库连接操作

    public class ConnectionDemo01{ // 定义MySQL的数据库驱动程序 public static final String DBDRIVER = "org.gj ...

  9. ffmpeg 学习:000-概述和库的组成

    背景 ffmpeg bin工具 可能无法满足产品的使用,于是需要通过传参调用ffmpeg库,即在通过更底层的方式使用它. FFmpeg 介绍 FFmpeg是领先的多媒体框架,能够解码,编码,转码,复用 ...

  10. Plcsim 模拟IO访问故障 OB122组织块

    假设在OB1 中用 如下指令 T PQW20 实际在组态的时候就没有QW20 这个地址 所以会显示访问IO 错误 我在OB122 中设置一个变量 进入一次 加1 可以看到每个扫描周期都要调用一次OB1 ...