Chinaunix首页 | 论坛 | 博客
  • 博客访问: 447166
  • 博文数量: 26
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1101
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-04 22:28
个人简介

Never stop learning.

文章分类

全部博文(26)

文章存档

2014年(2)

2013年(24)

分类: Python/Ruby

2013-09-04 13:51:51

Python中的对象(二)

By Harrison Feng in Python


《Python中的对象(一)》中,我们对Python的对象有了基本的认识。 今天我们要探索的是Python中对象之间的关系。
首先我们来看三个名词: Names, Objects, Bindings, 这三个词可以构成Python中对象之间的关系。

Names

简单的讲,就是命名空间(namespace)。Name存在于命名空间(namespace)里。在Python里,都不常用变量(variable)
这个词,而习惯于用Name。其实变量就是Name。而命名空间(Namespace)就是存放变量的地方。有局部的,全局的,
内置的和嵌套的命令空间(namespace)。每一种命名空间都有自己的作用域。

Bindings

Binding是对Name和Object之间关系的描述。简言之,Name被绑定(binding)到对象(Object)上。说的更直白些就是
Name被链接(link)到了对象,我们通过Name可以找到这个对象(Object)。如下图所示:

在实际的应用中,可以有很多方式将Name绑定(binding)到一个对象(Object)上。

1、赋值

例如,赋值语句 a = 'foo' 将使Python做下面的事情。如果对象 'foo' 不存在,将创建一个新的对象 'foo' 。如果它存
在,将找到它。下一步,将 a 增加到当前的命名空间,并将 a 绑定到对象 'foo'。如果 a 已经在于当前命名空间存在,
那么就直接将 a 绑定到对象 'foo'。这将解除 a 与之前对象的绑定,这个操作被叫做解除绑定或引用(Dereferencing)。
  1. a = 'xyz' # a绑定到对象'xyz'
  2. a = 'foo' # a重新绑定到对象'foo', a与对象'xyz'的绑定被解除。
过程如图所示:

我们来看一个经典的例子,这个例子证明了Name与对象之间的绑定(引用)关系。
  1. >>> a = 'xyz'
  2. >>> b = 'foo'
  3. >>> a, b
  4. ('xyz', 'foo')
  5. >>> a = b
  6. >>> a, b
  7. ('foo', 'foo')
  8. >>> b = 'swt'
  9. >>> a, b       # b的变化对a没有影响
  10. ('foo', 'swt')
  11. >>>
图示如下:

所以,a = b并没有使Name和对象变化,只是它们之间的绑定关系变了。

2、函数和类定义

声明一个函数或者类就是将描述的对象绑定到一个Name。
  1. >>> func_add = lambda a, b: a + b    # 在全局命名空间(global namespace)绑定func_add到函数对象
  2. >>> func_add
  3. <function <lambda> at 0xffec51ec>
  4. >>> def func_minus(a, b):            # 在全局命名空间(global namespace)绑定func_minus到函数对象
  5. ... return a - b
  6. ...
  7. >>> class Foo(object):               # 在全局命名空间(global namespace)绑定Foo到类对象
  8. ... def getSelf(self):               # 在类Foo的命名空间绑定getSelf到方法对象。
  9. ... return "Myself"
  10. ...
  1. >>> func_minus
  2. <function func_minus at 0xffec580c>
  3. >>> Foo
  4. <class '__main__.Foo'>
  5. >>> Foo().getSelf
  6. <bound method Foo.getSelf of <__main__.Foo object at 0xffed174c>>
  7. >>>

3、导入(import)语句

导入语句就是在当前的命名空间增加或者修改绑定关系。我们知道导入(import)语句有两种形式:

a、直接导入(import ..., import ... as ...

  1. >>> import os
  2. >>> import os as linux
增加os模块到当前的命名空间(namespace), 这些模块本身自己定义了自己的命名空间,你可以绑定它里面的对象通过
os.*.*....的模式。例如:
  1. >>> current_working_dir = os.getcwd()
  2. >>> current_working_dir
  3. '/home/harrison'

b、从模块导入(from ... import ...)

  1. >>> from sys import platform
  2. >>> platform
  3. 'linux2'
增加platform到当前的命名空间(namespace)。所以,可以直接引用platform,不再需要用sys.platform.
  1. >>> from sys import platform as plt
  2. >>> plt
  3. 'linux2'
  4. >>> platform
  5. Traceback (most recent call last):
  6.   File "", line 1, in <module>
  7. NameError: name 'platform' is not defined
将plt增加到当前命名空间,并绑定到sys.platform(sys的命名空间),所以直接引用plt。但是platform并没有
被增加到当前命名空间,因此引用platform时就会出现NameError。

4、循环语句(for)

for语句将循环的绑定对象到同一个Name。

  1. >>> for i in xrange(5): # 循环的绑定0,1,2,3,4到i。
  2. ... print i
  3. ...
  4. 0
  5. 1
  6. 2
  7. 3
  8. 4
  9. >>>

5、try ... except语句

try ... except语句可以选择性的绑定异常对象到Name。

  1. >>> try:
  2. ... __import__(oss)
  3. ... except NameError, ne:
  4. ... print ne
  5. ...
  6. name 'oss' is not defined
  7. >>>
绑定ne到异常对象NameError。
今天的分享了Python里对象(Object)和命名空间(Namespace)通过绑定(Binding)联系起来。关于这个三者之间关系,还有更有意思的,更深的内涵。我们将在下一篇文章分享。
敬请期待。

By Harrison Feng in Python

阅读(5501) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

CU博客助理2013-10-10 11:35:41

嘉宾点评:作者比较清晰的介绍了Python中的对象的基本概念及相关用法,很适合于初学Python的爱好者,好文。希望Python那些事能继续写下去:)(感谢您参与“原创博文评选”获奖结果即将公布)