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)。
-
a = 'xyz' # a绑定到对象'xyz'
-
a = 'foo' # a重新绑定到对象'foo', a与对象'xyz'的绑定被解除。
过程如图所示:
我们来看一个经典的例子,这个例子证明了Name与对象之间的绑定(引用)关系。
-
>>> a = 'xyz'
-
>>> b = 'foo'
-
>>> a, b
-
('xyz', 'foo')
-
>>> a = b
-
>>> a, b
-
('foo', 'foo')
-
>>> b = 'swt'
-
>>> a, b # b的变化对a没有影响
-
('foo', 'swt')
-
>>>
图示如下:
所以,a = b并没有使Name和对象变化,只是它们之间的绑定关系变了。
2、函数和类定义
声明一个函数或者类就是将描述的对象绑定到一个Name。
-
>>> func_add = lambda a, b: a + b # 在全局命名空间(global namespace)绑定func_add到函数对象
-
>>> func_add
-
<function <lambda> at 0xffec51ec>
-
>>> def func_minus(a, b): # 在全局命名空间(global namespace)绑定func_minus到函数对象
-
... return a - b
-
...
-
>>> class Foo(object): # 在全局命名空间(global namespace)绑定Foo到类对象
-
... def getSelf(self): # 在类Foo的命名空间绑定getSelf到方法对象。
-
... return "Myself"
-
...
-
>>> func_minus
-
<function func_minus at 0xffec580c>
-
>>> Foo
-
<class '__main__.Foo'>
-
>>> Foo().getSelf
-
<bound method Foo.getSelf of <__main__.Foo object at 0xffed174c>>
-
>>>
3、导入(import)语句
导入语句就是在当前的命名空间增加或者修改绑定关系。我们知道导入(import)语句有两种形式:
a、直接导入(import ..., import ... as ...)
-
>>> import os
-
>>> import os as linux
增加os模块到当前的命名空间(namespace), 这些模块本身自己定义了自己的命名空间,你可以绑定它里面的对象通过
os.*.*....的模式。例如:
-
>>> current_working_dir = os.getcwd()
-
>>> current_working_dir
-
'/home/harrison'
b、从模块导入(from ... import ...)
-
>>> from sys import platform
-
>>> platform
-
'linux2'
增加platform到当前的命名空间(namespace)。所以,可以直接引用platform,不再需要用sys.platform.
-
>>> from sys import platform as plt
-
>>> plt
-
'linux2'
-
>>> platform
-
Traceback (most recent call last):
-
File "", line 1, in <module>
-
NameError: name 'platform' is not defined
将plt增加到当前命名空间,并绑定到sys.platform(sys的命名空间),所以直接引用plt。但是platform并没有
被增加到当前命名空间,因此引用platform时就会出现NameError。
4、循环语句(for)
for语句将循环的绑定对象到同一个Name。
-
>>> for i in xrange(5): # 循环的绑定0,1,2,3,4到i。
-
... print i
-
...
-
0
-
1
-
2
-
3
-
4
-
>>>
5、try ... except语句
try ... except语句可以选择性的绑定异常对象到Name。
-
>>> try:
-
... __import__(oss)
-
... except NameError, ne:
-
... print ne
-
...
-
name 'oss' is not defined
-
>>>
绑定ne到异常对象NameError。
今天的分享了Python里对象(Object)和命名空间(Namespace)通过绑定(Binding)联系起来。关于这个三者之间关系,还有更有意思的,更深的内涵。我们将在下一篇文章分享。
敬请期待。
By Harrison Feng in Python
阅读(5524) | 评论(1) | 转发(0) |