设为首页 收藏本站
查看: 871|回复: 0

[经验分享] Python类型和对象

[复制链接]

尚未签到

发表于 2015-4-26 06:35:29 | 显示全部楼层 |阅读模式
  关键字:Python 类型 对象
原文:http://wiki.woodpecker.org.cn/moin/PyTypesAndObjects

关于本书

解释新式的Python对象(new-style):



  • and 是什么东西

  • 用户定义的类及实例是如何相互关联的,和内置类型有啥关系how user defined classes and instances are related to each other and to built-in types
  • metaclass是什么

新式类型New-style包含在Python2.2及以上,包括3.x。这些版本之间会有细微差异,不过这里涉及到的概念都是无差别的。本书讲的内容通常被称作Python类型系统或Python对象模型Python type system, or the object model.


  • 本书是以下系列的一部分:

    • Python Types and Objects [即你所看到的]

    • Python Attributes and Methods



This revision: 1.24



  • Discuss | Latest version | Cover page


  • Author: shalabh@cafepy.com




图索引



  • 1.1. 空白状态


  • 2.1. 鸡和蛋的关系


  • 2.2. 一些内置类型


  • 2.3. 用户定义对象


  • 3.1. Python对象图


  • 4.1. 关系


  • 4.2. 关系的传递




示例索引



  • 1.1. 查看integer对象


  • 2.1. 查看  和


  • 2.2. 关于  和 的更多内容


  • 2.3. 查看一些内置类型


  • 2.4. 通过子类化构建对象


  • 2.5. 通过实例化构建对象


  • 2.6. 使用class关键字定义类时指定一个type对象


  • 3.1. 更多内置 types


  • 3.2. 查看旧式类 classic classes




需要提前了解的

应该注意的一些:


  • 本书涵盖新式 new-style 对象 (在Python 2.2中引入). 本书例子适用于Python 2.5 及以上,包括 Python 3.x.
  • 本书不是为完全初学者写的. 而是针对已经对Python有所了解 (稍稍了解即可) 并希望对它了解更多的人.
  • 本书为掌握新式(new-style)属性访问及descriptors, properties等机制提供了所需的底层的要点。如果只对属性方法感兴趣,请移步至 Python Attributes and Methods, 阅读之后也就理解了本书的 Summary.

python之旅快乐?Happy pythoneering!


1. 基本概念



深入Object

怎样准确的表达python中object的含义呢? 系统中每个对象是一条规则 - 是一个实体的体现. 可以通过如下特征来确定一个对象:


  • 有标识名字 (i.e. 给定两个名字我们可以判断他们是否指向同一个对象).
  • 有值 - 对象可能包含一堆属性 (i.e. 比如可以通过 objectname.attributename获得其他对象).
  • 有类型 type - 每个对象有一个确定的类型. 例如对象2的类型是 int ,对象 "joe" 的类型是 string.
  • 有一个或多个 bases. 并非所有对象都有bases,一些特别的对象会有. A base 类似于面向对象术语中的超类或基类。


  • 如果你更在意具体的对象在内存中怎样存放,而不是更想知道一些抽象的概念,
  • 这对你理解每个对象在内存中都有个具体的位置(可以用id函数来获得)很有帮助。(---注:这句瞎解得,没真正理解,附原文)
  • If you are more of the 'I like to know how the bits are laid out' type as opposed to the 'I like the meta abstract ideas' type, it might be useful for you to know that each object also has a specific location in main memory that you can find by calling the id() function.

==== type 和 bases === (如果存在的话) 很重要,因为它们定义了对象和其他对象之间的特定关系. 请记住对象的types 和 bases只是另外一些对象.很快就会看到这一点.
你可能会想到对象有名字但名字不是对象的一部分. 对象名在对象之外的命名空间中存在(比如函数的本地变量) 或者作为另一个对象的属性.
即使对2这样一个简单对象所包含的东西也比我们眼睛看到的要多.
Example1.1. 查看integer对象



>>> two = 2   1
>>> type(two)
2
>>> type(type(two))
3
>>> type(two).__bases__
(,) 4
>>> dir(two) 5
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__',
'__delattr__', '__div__', '__divmod__', '__doc__', '__float__',
'__floordiv__', '__format__', '__getattribute__', '__getnewargs__',
'__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__',
'__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__',
'__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__',
'__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__',
'__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__',
'__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',
'__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
'__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',
'conjugate', 'denominator', 'imag', 'numerator', 'real']
  




  • 1 在当前命名空间中我们把这个integer命名为two.

  • 2 . 这是另一个对象, 现在来解剖一下. 注意这个对象也被称为 int 而  只是它打印出来的样子.


  • 3  的type是另外一个叫做 的对象象.


  • 4  的bases属性是一个tuple,这个tuple包含一个叫 的对象. 我想你没考虑过检查 bases这个属性 ;).

  • 5 列出这个原始integer对象的所有属性来 - 好多东西啊.

耐心点先来看我们的第一条规则

规则1

  • 任何东西都是一个object


int 是 object. 这不是说例如2和77这样的数字是object (他们确实是), 而是说确实有另外一个对象叫做 int ,他处于内存中的实际的整数之外的内存中. 实际上所有的整数对象的class属性都指向 int,他们共同的心声是"知我者int也". 在一个object上调用type()方法返回的也正好是这个对象的class属性的值.
我们定义的所有classes都是对象, 当然这些classes的实例也是对象.甚至我们定义的方法和函数也是对象. 并且像我们看到的,这些对象都有些不同.


空白状态

现在我们来从头构建python的对象系统. 我们从一个空白状态开始.
Figure 1.1. 空白状态
DSC0000.png
你可能在想为啥有两天灰色的竖线. 后面慢慢来揭晓. 竖线是来区别不同的区域的. 这个空白图中, 我们来逐渐加上各种对象,画上他们之间的关系,慢慢画满.
这个有助于帮助我们暂且搁置先入为主的各种有关面向对象的类和对象的观念,以对象的方式(我们这里的对象)来理解一切。


  • At this point, it helps if any preconceived object oriented notions of classes and objects are set aside, and everything is perceived in terms of objects (our objects) and relationships.



对象之间的关系

我们使用两种关系就可以连接我们所引入的这许多不同的对象. 这两种关系是子类-父类关系 (也可叫做特别化或继承, 如"人是个动物", 等等.) 和类-实例关系 (也叫实例化, 比如"Joe是个人", 等等.)。
如果你对这些概念已经熟悉了,可以继续往下看了,否则的话你可能需要先去看看这一部分“面向对象”.


2.引入对象



第一批对象

我们来查看 和 这两个对象.
Example 2.1. Examining  and



>>> object 1

>>> type 2

>>> type(object) 3

>>> object.__class__ 4

>>> object.__bases__ 5
()
>>> type.__class__ 6

>>> type.__bases__ 7
(,)
  




  • 1 2 这是python中两个最基本对象. 前面我们介绍过用type()来查看一个对象object的类型type(通常就是class属性的值). 其实,它本身是个对象,并且也是个查看其他对象类型的方式


  • 3 4 5 查看 : 的类型type是. 我们也验证了它的class属性确实和调用type()是一样的.


  • 6 7 查看 : 有趣的是的type是它自己! 它的bases属性包含了 .


下面我们来画一下所看到的.
Figure 2.1. 鸡和蛋的关系
DSC0001.png
图中两个对象是python最基本对象. 也可以一次介绍一个,但这里有个鸡和蛋一样的矛盾 - 先介绍哪个好? 这两个对象是互相依赖的 - 每一个本身都不能单独存在,都要借助对方来描述自己.
还是继续我们的python实验吧:
Example 2.2. 关于  和 的更多内容



>>> isinstance(object, object) 1
True
>>> isinstance(type, object) 2
True
  



  • 1 看看发生了什么? 这是 Dashed Arrow Up Rule 的一个应用. 由于 是 的子类, 则 的实例也是的实例.

  • 2 将 Dashed Arrow Up Rule 和 Dashed Arrow Down Rule 一起使用, 直接把箭头反过来也是正确的. (译注:事实上type,objcet的两两组合都是互为instance的)

如果对上面的证明不太理解, 没关系 - 反正也没什么用.
再看一个新概念 - 类对象type objects. 我们介绍过的对象都是类对象. 所说的类对象是什么呢? 类对象有如下共同特点:


  • 它们用来代表程序中抽象的数据类型. 例如, 用户定义的一个叫User的对象可能用来表示系统中所有的用户,另一个叫int的对象可能代表所有的整数.
  • 它们可以被子类化. 你可以新建一个与已存在的类对象有点类似的新对象.已存在的类对象将成为这个新对象的基类.

  • 它们可以被实例化. 意味着你可以新建一个已存在对象的实例. 这个新对象的class属性就是已存在对象.


  • 任何类对象的类型是 .

  • 它们有时被称为types有时称为classes.

是的. Types和classes在Python中确实是同一个东西 (免责声明: 对老式类和早于2.2版本的Python不适用. 那是 types和classes有些不同但那时很久前的事了,现在已这些不同点已经一致了。因此让过去的事就过去吧,不好吗?). 不要吃惊,使用type()函数和class属性得到的是一样的.
class 这个术语传统是指被class这个关键字创建的class. 内置类型 (比如int和string)通常不和classes联系起来, 这更多是约定俗成的,实际上types和classes是同一个东西.我觉得这点很重要,可以提出一个规则:

Class is Type is Class


  • type和class这两个术语在所有Python >= 2.3的版本中是一样的.



类对象Types 和 (嗯,,让我想个更好的词) 非类对象non-types (呵呵!) 都是对象 但只有types可以子类化. Non-types代表的是具体的值所以子类化并没有意义. 非类对象的两个例子是整数 2 以及字符串 "hello". 想想,2的子类是什么意思,没意思吧?
还对判断类对象和非类对象感觉混淆吗?有一个简单的规则:

类和非类对象判断规则Type Or Non-type Test Rule


  • 如果一个对象是的实例, 那它就是类对象. 否则是非类对象.



回头看,可以证明这个规则对我们所碰到的所有对象都是成立的, 包括 ,它是自己的实例.
总结一下:



  • 是 的一个实例.


  • 不是任何类的子类.


  • 是自己的实例.


  • 是 的子类.

  • python中只有两种对象: 为了清楚叫它们types 和 non-types. Non-types 也可以叫实例, 但实例这个术语也可以指向一个类对象, 因为一个type一定是另一个的type的实例. Types 也被叫做 classes, 并且我经常把他们叫做classes.



  • Note that we are drawing arrows on our slate for only the direct relationships, not the implied ones (i.e. only if one object is another's class, or in the other's bases). This make economic use of the slate and our mental capacity.




更多内置类型

Python中不止这两个对象,这两个基本对象有一堆的兄弟
Figure 2.2. 一些内置类型
DSC0002.png
上面展示了一些内置对象,下面解释一下.
Example 2.3. 查看一些内置类型



>>> list 1

>>> list.__class__  2

>>> list.__bases__  3
(,)
>>> tuple.__class__, tuple.__bases__ 4
(, (,))
>>> dict.__class__, dict.__bases__ 5
(, (,))
>>>
>>> mylist = [1,2,3] 6
>>> mylist.__class__ 7

  



  • 1 内置的 对象.


  • 2 的类型是.


  • 3 它有一个基类 (即 superclass), .


  • 4 5 类似的还有  和 .


  • 6 创建的实例的方法.


  • 7 一个list对象的type是

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60644-1-1.html 上篇帖子: python C扩展 下篇帖子: Python天天美味(32)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表