python 类型和对象 (Shalabh Chaturvedi)

来源:互联网 发布:优酷网络大电影分成 编辑:程序博客网 时间:2024/06/04 20:10

#仅意译其中关键的部分

阅读之前的说明:

1. 本文覆盖新式对象的说明(从python2.2引入的new style object),其中的例子适用于python2.5 - python3.x.

2.本文并非适用于python初级新手,至少要懂一点点python

3.本文提供了理解新式对象属性访问的基础,如果你对属性(还包括修饰符等等)感兴趣,请出门右转到“python的属性和方法”。不过你必须对本文的总结部分了如指掌。


第一章 基本概念

对象

什么是python的对象?对象就是包含如下的特性的东东:

  • 有个ID
  • 有一些属性
  • 一定有自己的类型(或者说一定是某个类型的实例)
  • 可能有多个父类(除了object这个特殊的对象)

总而言之,python里面多有的东西都是对象(我们定义,或者系统内建的class是对象,当然这些class的实例更是对象,函数也是对象的一种)。你可以用函数type(),或者是直接访问对象的__class__属性,获取对象所属的类型。

当然class这种对象,和class的实例这种对象确实很不相同,也就是说对象确实可以分为不同的类别。

对象的关系

对象之间有且只有两种关系

  • 父子类关系(superclass - subclass)
  • 类型和实例的关系(type - instance)

第二章 谈谈对象

先来看看对象中的老祖宗object和type,他们的关系如下(实线代表superclass-subclass关系,虚线代表type-instance关系):

Chicken and Egg

type这个对象是所有类型的太祖(type所属的类型就是自己,所以无可追溯),当然也是object这个对象所属的类型。

而object是所有对象的父类-superclass(当然也是type的superclass),而object自己的superclass为空(object.__bases__==()),所以他自己是悟空,从石头里蹦出来滴。

而前文说到对象也分派别,其实就分成两派(类型对象 和 非类型对象),简单来说,你定义的class就是类型对象,而class的实例就是非类型对象。严格来说,类型对象符合如下特征:

  • 从程序设计的角度,类型对象代表一些抽象的概念。(比如所有的数字,integer类型对象)
  • 他们可以有子类-subclass
  • 他们可以实例化
  • 他们所属的类型,就是老祖宗type对象
  • 有人喜欢叫他们types-类型,有人喜欢叫他们class-类(是的,type 和 class 在python里是一个东西(python的版本>=2.3))

问:如何区分类型对象和非类型对象?

答:对象如果是type的实例,那就是类型对象(或者简称类型type),反之则是非类型对象

好吧,让我们来看个例子:

Some Built-in Types

果然,list tuple dict object type都是类型对象,list的实例mylist是非类型对象。(看出来区别了吧,所有类型对象的父类都是type)

如何创建对象呢?方法有二:

通过继承的方式创建类型对象

除了系统自带的类型对象(list tuple dict),你肯定会写很多自己的类型对象,而这些类型对象必须有源头(父类),当然可以有多个父类。(在python2.x,你必须显式的从object继承到自己的类型,而python3.x默认就是从object继承)

通过实例化创建一个对象

通过方法(),可以实例化对象。(这个对象可能是类型的,也可能是非类型的)


所以我们再来看看这个大家族:

User Built Objects

黄色系的对象是类型对象,全部源自父类object(当然object除外),而蓝色系的非类型对象,都是通过实例化黄色系的类型对象而来。而黄色的类型对象其实也是通过实例化而来的,他们都来自于type对象的实例化(你在做继承的时候,这种实例化就已经偷偷发生了,而且实例化的类型对象取决于你继承的父类)。

所以从某种角度说:一切对象都是实例化而来的。


第三章 总结

首先还是总体的对象关系图:

The Python Objects Map

OK,总结如下:

  • 对象分为类型和非类型对象:类型对象可以实例化,可以被继承;而非类型对象不可以。

  • type和object是整个python系统的初始对象

  • 所有对象都有自己的类型(object.__class__)

  • 所有类型对象都有自己的父类(object.__bases__)

  • 用继承的方式创建新对象,那么你可以选择原语class,并且说明他的父类,当然这种对象肯定是类型对象

  • 用实例化的方式(operator ()),你可以创建任何对象(包括类型对象和非类型对象),当然这个取决于你用什么对象来实例化

  • 系统内置的一些对象可以通过特殊的符号来创建(比如list对象可以用[]),当然这是一种语法糖衣咯

  • python内部,是通过实例化的方式来创建类型对象的。而创建所使用的类型对象取决于此对象的父类(也就是实例化父类的对象来实例化他的子类)

  • issubclass(A,B)可以测试A,B是否有superclass-subclass关系

  • isinstance(A,B)可以测试A,B是否有type-instance关系

0 0
原创粉丝点击