python2.7.3和3.3.2的区别

在面向对象程序设计这方面,具体点好么,谢谢!... 在面向对象程序设计这方面,具体点好么,谢谢! 展开
百度网友9ff3c3a08
推荐于2018-03-09 · TA获得超过188个赞
知道小有建树答主
回答量:213
采纳率:0%
帮助的人:229万
展开全部
  转自:http://my.oschina.net/chihz/blog/123437
  这边只说明面向对象方面的,其他方面见上面链接

  面向对象
  (1) 经典类和新式类
  Python OO最神奇的地方就是有两种类,经典类和新式类。
  新式类跟经典类的差别主要是以下几点:
  1. 新式类对象可以直接通过__class__属性获取自身类型:type
  2. 继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动
  3. 新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。
  4. 新式类增加了__getattribute__方法
  Python 2.x中默认都是经典类,只有显式继承了object才是新式类
  Python 3.x中默认都是新式类,不必显式的继承object
  python 2.x:
  >>> ClassicClass.__class__
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  AttributeError: class ClassicClass has no attribute '__class__'
  >>> class NewClass(object):
  ... pass
  ...
  >>> NewClass.__class__
  
  python 3.x:
  >>> class NewClass:pass
  ...
  >>> NewClass.__class__
   <class 'type'>
  (2) 无绑定方法
  在Python 2.x中除了类方法和静态方法,其余的方法都必须在第一个参数传递self跟实例绑定,但是在Python 3.x中废除了这条规定,允许方法不绑定实例,这样的方法跟普通的函数没有区别:
  Python 2.x:
   >>> class MyClass:
   ... def function():
   ... print "function"
   ...
   >>> MyClass.function()
   Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   TypeError: unbound method function() must be called with MyClass instance as first argument (got nothing instead)
   >>> m = MyClass()
   >>> m.function()
   Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   TypeError: function() takes no arguments (1 given)
  Python 3.x:
   >>> class MyClass:
   ... def function():
   ... print("function")
   ...
   >>> MyClass.function()
   function
   >>> m = MyClass()
   >>> m.function()
   Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   TypeError: function() takes no arguments (1 given)
  (3) 重要的重载
  1. next()和__next__():这应该是继print之后第二大坑爹的不兼容吧,Python程序漫山遍野都是迭代器,但是2和3之间迭代器的实现接口方法名是不同的……嗯,啥都不说了。
  2. 分片拦截:Python 3.x之前, 类可以定义__getslice__和__setslice__方法来专门拦截分片,并且这两个方法优先于__getitem__和__setitem__, 但是Python 3.x时代这俩方法再也不存在了,全部的工作都交给了__getitem__和__setitem__,因此在使用这两个方法之前要先判断传递进参数的类型是不是slice对象。
  3. __bool__方法:我们知道Python中默认将所有的空对象定义为布尔意义上的False,在自己定义的类中我们也可以加入自定义的布尔判断标准,在2.x中这个方法名叫做__nonzero__, 这个名字显然非常不直观并且不科学!所有考试交白卷的孩子我们都要否定他们的才能么?显然不能!因此Python 3.x中这个方法被重名命为__bool__
  4. 3.x 取消了用于大小比较的__cmp__方法,取而代之的是:__lt__、__gt__、__le__、__ge__、__eq__、__ne__,嗯,我感觉这个想法真是不能苟同……有谁能说服我给我洗脑让我爱上这一堆__lt__、__gt__、__le__、__ge__、__eq__、__ne__么。。。
  (4) 类修饰器
  在我的上一篇博客中秀了一把函数装饰器在表单验证中的使用,http://my.oschina.net/chihz/blog/122897
  在3.x的时代,类也有装饰器了,这个装饰器威力巨大,能把装饰的类搞的面目全非,总之想怎么搞就怎么搞,用法同函数装饰器基本一致,只不过传递的参数是类型:
   >>> def shutdown(cls):
   ... def shutdown_func(self):
   ... print("do something...")
   ... cls.shutdown = shutdown_func
   ... return cls
   ...
   >>> @shutdown
   ... class Test:pass
   ...
   >>> t = Test()
   >>> t.shutdown()
   do something...

  异常

  先来看一段代码
  python 2.x:
   >>> class Person:
   ... def __init__(self, msg):
   ... self.msg = msg
   ...
   >>> try:
   ... raise Person, "woca"
   ... except Person as p:
   ... print p.msg
   ...
   woca
  python 3.x:
   >>> class Person:
   ... def __init__(self, msg):
   ... self.msg = msg
   ...
   >>> try:
   ... raise Person("woca")
   ... except Person as p:
   ... print(p.msg)
   Traceback (most recent call last):
   File "<stdin>", line 2, in <module>
   TypeError: exceptions must derive from BaseException
  
   During handling of the above exception, another exception occurred:
  
   Traceback (most recent call last):
   File "<stdin>", line 3, in <module>
   TypeError: catching classes that do not inherit from BaseException is not allowed
   >>>
  接下来说不同:
  1. 在2.x时代,所有类型的对象都是可以被直接抛出的,在3.x时代,只有继承自BaseException的对象才可以被抛出。
  2. 2.x raise语句使用逗号将抛出对象类型和参数分开,3.x取消了这种奇葩的写法,直接调用构造函数抛出对象即可。
  在2.x时代,异常在代码中除了表示程序错误,还经常做一些普通控制结构应该做的事情,在3.x中可以看出,设计者让异常变的更加专一,只有在错误发生的情况才能去用异常捕获语句来处理。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式