python's object model

 1、object.__init__(self[, ...])

       如果subclass没有实现__init__,那么python类在实例化的时候,显然会调用到父ClassObject的__init__,所以在subclass没实现__init__的时候,对象可以正常实现继承特性。

如果subclass实现了__init__,但是没有调用super的__init__,则父类实例中的变量在子类实例中不会存在,因为没有执行父ClassObject的__init__,所以无法正常实现继承特性。

  If a base class has an __init__() method, the derived class’s __init__() method, if any, must explicitly call it to ensure proper initialization of the base class part of the instance; for example: BaseClass.__init__(self, [args...])

  需使用super来调用继承链上下一个__init__。

 2、class.__mro__, class.mro(),MethodResolutionOrder

  class.mro()是C3算法的实现,class.__mro__包含C3算法的結果。

  从python2.3起C3算法用于检测多重继承中是否存在环,即A->B,B->A的情况,若存在则runtime错误。显然在C3算法的保证下,python2.3起多重继承序并不是深度优先,也不是广度优先。而是一种深度优先的拓扑排序。

  C3算法参考:http://blog.sina.com.cn/s/blog_45ac0d0a01018488.html

 3、super()函数按照C3算法生成的mro来选择后继类,即当前类后面的类对象中寻找。

  super参考:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html

 4. getattr(objectname[, default])

  Return the value of the named attribute of objectname must be a string. If the string is the name of one of the object’s attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.

 5、hasattr(objectname)

  The arguments are an object and a string. The result is True if the string is the name of one of the object’s attributes, False if not. (This is implemented by calling getattr(object, name) and seeing whether it raises an exception or not.)

 6、None

  None是一个特殊的常量。None和False不同。None不是0。None不是空字符串。None和任何其他的数据类型比较永远返回False。None有自己的数据类型NoneType。你可以将None复制给任何变量,但是你不能创建其他NoneType对象。

  参考:http://eriol.iteye.com/blog/1319295

 7、object.__call__(self[, args...])

  Called when the instance is “called” as a function; if this method is defined, x(arg1, arg2, ...) is a shorthand for x.__call__(arg1, arg2, ...).

  Class instances are callable only when the class has a __call__() method; x(arguments) is a shorthand for x.__call__(arguments).

 8、所有的instance.__class__指向自己的Class Type,所有class.__class__指向type对象。

  测试程序:     输出为:

  可见所有class.__class__指向都一样

 9、type(object)  &  type(namebasesdict)

  With one argument, return the type of an object. The return value is a type object. The isinstance() built-in function is recommended for testing the type of an object.

  With three arguments, return a new type object. This is essentially a dynamic form of the class statement. The name string is the class name and becomes the __name__ attribute; the bases tuple itemizes the base classes and becomes the __bases__ attribute; and the dict dictionary is the namespace containing definitions for class body and becomes the __dict__ attribute.

 10、type & object, type、object是python对象模型的两大基石,

  1)type(object)函数是根据 instace.__class__.来判断类型,该对象的__name__即为类名

  2)type.__class__指向type本身。
  3)ClassObject的基类以 classobject.__bases__来确认。
  
 11、__getattribute__、__getattr__、__dict__、object.__getattribute__
   object.__getattribute__的实现是从实例的__dict__中取数据,如果取不到,则从__class__中取;__class__中取不到的话,__class__.__getattribute__则从__bases__去取。
   只要调用instance.xxx,那么__getattribute__就会被触发。所以instance.__dict__会触发__getattribute__。object.__getattribte__遇到 __dict__会把__dict__本身给返回 。
   __getattr__用于当__getattribute__抛出异常时使用。 
 12、object()函数用于生成一个空对象
 13、方法(函数概述)

   1)使用def class: body 定义的方法,均保存在 ClassType的 __dict__中,当instance要调用时,是则ClassType的__dict__中找出来的。

   2)方法(函数)只有三种:

    1))function:如果在ClassType的__dict__中,通过instance调用时,为绑定方法。如果在instance的__dict__中,通过instance调用,则为非绑定方法。

    2))classmethod:绑定了cls

    3))staticmethod:永远不会绑定

   3)可以给ClassType、instance动态添加方法、属性,但object()生成的instance无法添加。

python's object model的更多相关文章

  1. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  2. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  3. Selenium的PO模式(Page Object Model)[python版]

     Page Object Model 简称POM  普通的测试用例代码: .... #测试用例 def test_login_mail(self): driver = self.driver driv ...

  4. Python+Selenium框架设计--- Page Object Model

    POM(Page Object Model):页面对象模型,POM是一种最近几年非常流行的自动化测试模型,或者思想,POM不是一个框架,就是一个解决问题的思想.采用POM的目的,是为了解决前端中UI变 ...

  5. Nova Conductor 与 Versioned Object Model 机制

    目录 文章目录 目录 Nova Conductor 数据库访问代理机制 Versioned Object Model 机制 Nova Conductor Conductor 服务作为 Nova 核心部 ...

  6. 在C#开发中如何使用Client Object Model客户端代码获得SharePoint 网站、列表的权限情况

    自从人类学会了使用火,烤制的方式替代了人类的消化系统部分功能,从此人类的消化系统更加简单,加速了人脑的进化:自从SharePoint 2010开始有了Client Side Object Model ...

  7. 解决在使用client object model的时候报“object does not belong to a list”错误

    在查看别人代码的时候,发现了个有意思的问题,使用client object model将一个文件check in 我使用的是如下语句获取file Microsoft.SharePoint.Client ...

  8. SharePoint Client Object Model API 介绍以及工作原理解析

    CSOM和ServerAPI 的对比 SharePoint从2010开始引入了Client Object Model的API(后文中用CSOM来代替),从名字来看,我们可以简单的看出,该API是面向客 ...

  9. BOM (Browser Object Model) 浏览器对象模型

    l对象的角色,因此所有在全局作用域中声明的变量/函数都会变成window对象的属性和方法; // PS:尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的对象是否存 ...

随机推荐

  1. Can't create session svn: Unable to connect to a repository at URL “...”的解决方案

    Can't create sessionsvn: Unable to connect to a repository at URL '...' Cannot negotiate authenticat ...

  2. Redis.RedisNativeClient的方法get_Db 没有实现

    C#出现问题:Redis.RedisNativeClient”的方法“get_Db”没有实现 ServiceStack.Redis.RedisNativeClient”的方法“get_Db”没有实现 ...

  3. Artix-7 50T FPGA试用笔记之Create a simple MicroBlaze System

    前言:之前笔者的试用博文提到安富利这块板子非常适合MicroBlaze开发,同时网上关于MicroBlaze的资料非常少(或含糊不清),没有一篇能完整介绍VIVADO SDK的设计流程,所以笔者带来这 ...

  4. 你以为在用SharePoint但其实不是

    博客地址 http://blog.csdn.net/foxdave 原文链接:http://www.techrepublic.com/blog/tech-decision-maker/you-thin ...

  5. CentOS7进程管理systemd详解

      概述: 系统启动过程中,当内核启动完成,后加载根文件系统,后就绪的一些用户空间的服务的管理工作,就交由init进行启动和管理,在CentOS6之前的init的管理方式都类似,相关的内容我们在之前的 ...

  6. 内存泄漏 之 MAT工具的使用

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,其中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  7. 自动化测试--响应请求测试(.net)

    Web运行原理简单地说是“浏览器发送一个HTTP Request到Web服务器上,Web服务器处理完后将结果(HTTP Response)返回给浏览器”. 通常测试一个web api是否正确,可以通过 ...

  8. Redis3.0集群

    Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性 ...

  9. UVA11732 "strcmp()" Anyone?【左儿子右兄弟Trie】

    LINK1 LINK2 题目大意 给你一些字符串,并定义了一个函数(具体见题面) 问你把任意两个字符串放到函数里面得到的值的和是多少 思路 该怎么统计答案呢? 每次考虑当前插入的串和所有已经插入过的串 ...

  10. form表单传递对象数组

    ajax传递数组.form表单提交对象数组 在JSP页面开发中,我们常常会用到form表单做数据提交,由于以前一直只是使用 form表单提交单个对象,只要表单文本域的name值和接收的对象的属性名一致 ...