一、python中的对象

1、python中对象种类及关系

<type 'type'>:该对象可以成为其他类的类型,python中几乎所有对象都是直接或间接由<type 'type'>创建,我们称这种特殊的对象为metaclass对象,即元类。

<type 'object'>:现在的python中所有的类都必须直接或间接继承自该对象。

class对象:系统内置或自定义对象,通过<type 'type'>被创建,即我们通常所说的类。

instance对象:由class对象实例化得到,即我们通常所说的对象。

所有class对象都继承自<type 'object'>,类的类型也都为<type 'type'>。所以class对象既可以作为class对象用来生成instance对象,也是instance对象。

注:class对象既然是instance对象,那么它也应该跟一般的instance对象一样可被调用。

    class A():
def __call__(self):
print 'Hello World'
a = A()
a() #Hello World

可调用性:在python中通过__call__方法决定是否可以调用,在class对象中实现了__call__方法,则class对象也如同instance对象一样可被用。

2.新式类、旧式类

产生原因:旧式类中自定义class对象无法继承系统内置的class对象。

新/旧类的区别: 1.新式类相同父类只执行一次构造函数,经典类重复执行多次。

2.新式类的MRO(method resolution order 基类搜索顺序)算法采用C3算法广度优先搜索,而旧式类的MRO算法是采用深度优先搜索。

3.新式类解决无法继承内置class对象的方法

在定义object时添加了一个tp_dict域,用以解决旧式类存在的问题。当python启动后,根据object对象对内置对象进行完善,当自定义对象时通过继承object对象。从而实现内置对象与自定义对象的一致性。

二、类的实现

1、<type 'object'>在创建类时的作用

处理基类:在python中存在一个概念 —— __slot__,在__solt__中存储着object中定义的操作名,在python运行后__slot__中存储的操作名根据地址偏移等找到实际的操作,将操作存储在tp_dict中。

__slots__:通过定义一个特殊的__slots__变量,来限制该class能添加的属性。

   class Student(object):
__slots__ = ('name', 'age')

继承的实现:1、设置type信息、基类及基类列表
                          2、填充tp_dict
                          3、基于mro列表从基类继承操作
                          4、设置子类列表

class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score

注:python为多继承,在子类中需调用父类的__init__方法,对父类进行初始化。

2、<type 'type'>在创建的作用

class元信息 = 动态元信息 + 静态元信息
    动态元信息:即为class的属性、方法等,在代码动态运行时确定。
    静态元信息:定义了所有对象如何创建,分配内存大小等。通过<type 'type'>确定。即metaclass。
    
    class的创建过程:1、解析出类名、基类列表和属性表。
                                  2、确定最佳的mateclass和base(<type 'type'>、<type 'object'>)。
                                  3、为class对象分配所需的内存空间。

自定义元类,代替<type 'type'>创建对象:

     class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs) class MyList(list):
__metaclass__ = ListMetaclass

3.python中的私有化

私有化:python并不提供真正意义上的私有化支持,变量或方法加_实际是改变了其访问名称,增加了访问难度。

__func__:表示为魔法方法,在特定时候python虚拟机自动调用。

__func:双下划线开始的属性会在解释时在前面加上下划线和类名,如self.__num会被解析为self._className__num。

_func:用以标记该方法或属性为私有,不应该在作用域范围之外被访问。

三、类的实例化

1、instance对象的创建

从class到instance:1、instance = class.__new__(class,args,kwds)调用type中的方法分配内存空间。
                                            2、class.__init__(instance,args,kwds)对分配的空间进行初始化操作。
                                        注:若没有定义__init__则会调用object的__init__。

创建class与创建instance对象空间分配的不同:分配的空间大小不同,创建instance时创建的空间需要加上基类的空间。

<type 'type'>在创建instance对象中的作用:<type 'type'>在创建instance对象过程中用来进行分配内存。

python中的类机制的更多相关文章

  1. 《python解释器源码剖析》第13章--python虚拟机中的类机制

    13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...

  2. Python Python中的反射机制

    Python中的反射机制 by:授客 QQ:1033553122 概念 借用java中的定义:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方 ...

  3. 4、Python中的类详解(0601)

    <大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...

  4. Python中新式类和经典类的区别,钻石继承

    1)首先,写法不一样: class A: pass class B(object): 2)在多继承中,新式类采用广度优先搜索,而旧式类是采用深度优先搜索. 3)新式类更符合OOP编程思想,统一了pyt ...

  5. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  6. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  7. Python中的类(上)

    在Python中,可以通过class关键字定义自己的类,然后通过自定义的类对象类创建实例对象. 例如,下面创建了一个Student的类,并且实现了这个类的初始化函数"__init__&quo ...

  8. python中新式类和经典类

    python中的类分为新式类和经典类,具体有什么区别呢?简单的说, 1.新式类都从object继承,经典类不需要. Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Pyth ...

  9. python中的类(二)

    python中的类(二) 六.类的成员 字段:普通字段,静态字段 eg: class Province(): country=’中国’ #静态字段,保存在类中,执行时可以通过类或对象访问 def __ ...

随机推荐

  1. JSP自定义标签必知必会

    自定义标签技术自sun公司发布以来,便一向很受欢迎!下面我就来谈一谈如何实现自定义标签,以及如何使用自定义标签. 如何实现自定义标签 首先我们应该知道原理,不管是标签还是JSP,本身实际上都会被JSP ...

  2. 交叉验证(CrossValidation)方法

    分类器模型通常在特定的数据上进行训练,由于所得模型可能存在过拟合的现象.因此,模型训练完成之后通常需要进行检验,以验证分类模型在未知数据集上的预测能力,即我们通常所说的"模型泛化" ...

  3. 软考之路--从生活着手,看PV如何操作

    PV操作,是软考当中一个很重要的考点,一听到这个名词,顿时赶脚高大上有么有,在软考的历年试题中,也不乏PV操作的身影,老师也对PV操作进行了一次讲课,那时年少,听得稀里糊涂,也不是很理解,在小编的理解 ...

  4. velocity 时间显示 时间格式化 时间转化

    思想:通过前台展现层(Velocity)中的工具(tools)方法来修改. *************** 具体修改步骤: 1.在toolbox.xml配置文件中添加以下代码: <tool> ...

  5. 我眼中的Linux设备树(二 节点)

    二 节点(node)的表示首先说节点的表示方法,除了根节点只用一个斜杠"/"表示外,其他节点的表示形式如"node-name@unit-address".@前边 ...

  6. Leetcode_70_Climbing Stairs

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41851705 You are climbing a sta ...

  7. Spring揭秘 读书笔记 四----方法注入

    我们知道,拥有prototype类型scope的bean,在请求方每次向容器请求该类型对象的时候,容器都会返回一个全新的该对象实例. 我们看下面的例子: public class MockNewsPe ...

  8. JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

    JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...

  9. 开源图像检索工具:Caliph&Emir使用方法

    Caliph&Emir是基于MPEG7的软件.它是用Java编写的开源软件.采用了lucene完成索引和检索功能.是研究MPEG7标准,图像检索等等方面不可多得的好工具. 在此介绍一下它们的基 ...

  10. [FreeRadius2]遇到问题记录

    在学习FreeRadius2中遇到的问题,和解决. 使用的是2.2 版本,测试的系统是Centos6.7 radtest 没有响应 radiusd 启动正常,测试如下命令不好使 [root@orang ...