注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

互联网产品经理的窝

梦想社:一个人为了梦想,始终没有停下自己的脚步

 
 
 

日志

 
 

【Python 笔记】变量·类型·对象(二)  

2011-12-03 00:19:47|  分类: python |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

转自别人博客的,想查找第一出处,但始终无果(N多博客都有,都无人写转字)。

感谢第一作者的辛勤劳动~


话说上次总结了 Python 变量的特点——只作为对象的链接符号,不持有任何类型和状态,那么这次就总结下 Python 中的对象。

作为初学的小白,总结的很浅显很基础应该是可以理解的吧 - -|||

Python 中对象有两个特点,首先对象是强类型的,也就是一旦生成类型就不可变。所谓的强制类型转换,实质是重新生成了对象而已,并不代表对象类型改变;其次,对象——所有对象都是物理存在的,这点听上去有点无聊,事实上是在 Python 眼花缭乱的元编程特性下,保持“原则”的一条底线,这个下面再总结。

然后再说下 Python 离谱的对象范围——对比 Java/C++ 对象模型(这个应该是工业公认的标准了)。在 Java/C++ 对象模型中,类是对对象的定义(注意用词,是定义),而对象是类“实例化”的产物。而 Python 中对象的范围比这要广阔的多,为了避免混淆,下面不再把类 new 出来的那货叫“对象”,而更加严谨的称为“实例”。

一个类,是一个对象

>>> class Foo(object):
    pass

>>> print Foo
<class '__main__.Foo'>
>>> dir(Foo)
['__class__''__delattr__''__dict__''__doc__''__format__''__getattribute__''__hash__''__init__','__module__''__new__''__reduce__''__reduce_ex__''__repr__''__setattr__''__sizeof__''__str__','__subclasshook__''__weakref__']
>>>

dir 是 Python 中列举对象属性的函数(算是反射吧)

一个内置基本类型的数据,比如整型数字,也是对象:
>>> num = 2012
>>> dir(num)
['__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__''bit_length''conjugate','denominator''imag''numerator''real']
>>>

各种离谱的是,一个函数也是一个对象:

>>> def sum():
    print '==!'

    
>>> sum()
==!
>>> dir(sum)
['__call__''__class__''__closure__''__code__''__defaults__''__delattr__''__dict__''__doc__','__format__''__get__''__getattribute__''__globals__''__hash__''__init__''__module__''__name__','__new__''__reduce__''__reduce_ex__''__repr__''__setattr__''__sizeof__''__str__''__subclasshook__','func_closure''func_code''func_defaults''func_dict''func_doc''func_globals''func_name']
>>>

而上面的类、函数,在 Java/C++ 中都是作为一种“定义”存在的,一种语法级别的定义。而在 Python 中,它们统统不是定义,在写这些类这些函数的时候,实际上是在创建对象!

而这些对象,全部都有上面总结的两条特征。类型是不可变的,同时是物理存在的,而不是一种噱头。

Python 除了 dir 这种自省特性的函数,还有一个内置的 type 函数。说通俗点是查看对象的类型,但我们按照 Python 的思路说:type 是返回对象的元对象(例如类是实例的元对象)的函数。所以像 Java 一样假惺惺把所有东西都写在类中,最多是面向类编程。而 Python 是真正的面向对象,其对象不依赖于类的定义,但无处不在。

我们可以通过定义函数定义类来自己定义对象,同时 Python 也内置了很多对象,是通过 Python 解释器内部编码实现的。但无论如何,这些对象都有统一的特性。

在类的定义这块,由于 Python 这种对象模型,类和实例之间有着微妙的关系,这也造成了 Python 中实例和 Java 很大不同的一些特点。这些特点使 Python 有着看似荒谬的种种风格,而一旦理解了这些特点将不再感到荒谬,而感叹于 Python 的优雅——用最简单的方法,来表达复杂的世界。

好吧,磨了几天摸出来一点点的速度,远远没达到原来的预期。下一篇再总结 Python 中类和实例、元类和类之间的种种关系,总结 Python 中最复杂的东西都能围绕同一个核心的魅力。


  评论这张
 
阅读(184)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017