首页
登录 | 注册

【Python那些事儿之四】Python中的对象(二)-a

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


相关文章

  • 【Python那些事儿之五】Python中的对象(三)-a
    Python中的对象(三) By Harrison Feng in Python 我们在前面的两篇文章<Python中的对象(一)>,<Python中的对象(二)>中分别分享了对象的基本概念以及Python 中对象的 ...
  • Python中的对象(一) By Harrison Feng   学习和使用过面向对象的程序设计概念的朋友们应该非常了解在面向对象的语言中,对象(objects)是什么.如果 你现在还不了解面向对象的程序设计概念,那么先请阅读下面的文章. ...
  • 【Python那些事儿之六】Python中的对象(四)-a
    Python中的对象(四) by Harrison Feng in Python 在上一篇文章<Python中的对象(三)>中,我们探讨了Python对象的mutability,今天我们要分享的是复制对象和比较两个对象. 在&l ...
  • [Python那些事儿之七]Iterators详解 by Harrison Feng in Python 我们都知道,Python有for循环.我们可以用for循环在各种容器container上遍历其所有可用的元素. 比如: 在列表(lis ...
  • [Python那些事儿之八]Generators详解 by Harrison Feng in Python 生成器(Generator)在计算机科学中是用于控制循环迭代行为的一种特殊程序.简单的讲,它其实就是一个特别的 函数.在Python ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.015 s.
京ICP备10005923号