python 旧式类和新式类,有什么特点,举例说明
时间: 2023-08-31 22:41:16 浏览: 126
### 回答1:
Python 2.x 和 Python 3.x 是 Python 语言的两个主要版本。它们在语法、函数和标准库等方面有一些不同之处。下面是它们之间的一些主要区别:
1. 打印函数
在 Python 2.x 中,打印函数是 `print`,而在 Python 3.x 中,它被改为了 `print()` 函数。在 Python 2.x 中,您可以像这样使用 `print` 函数:
```python
print "Hello, world!"
```
在 Python 3.x 中,您需要在 `print` 函数中使用圆括号:
```python
print("Hello, world!")
```
2. 整数除法
在 Python 2.x 中,整数除法的结果将四舍五入为最接近的整数。例如,`5/2` 的结果为 `2`。在 Python 3.x 中,整数除法将保留小数部分,结果为浮点数。例如,`5/2` 的结果为 `2.5`。
3. xrange() 函数
在 Python 2.x 中,有一个称为 `xrange()` 的函数,它返回一个迭代器,用于生成整数序列。在 Python 3.x 中,这个函数被删除了,而 `range()` 函数现在返回一个类似于 Python 2.x 中 `xrange()` 的迭代器。
4. Unicode 字符串
在 Python 2.x 中,字符串类型有两种:ASCII 字符串和 Unicode 字符串。默认情况下,字符串类型被定义为 ASCII 字符串。在 Python 3.x 中,字符串类型被定义为 Unicode 字符串,这意味着它们可以包含任意的 Unicode 字符。
5. 异常处理语法
在 Python 2.x 中,异常处理语法是这样的:
```python
try:
# some code that may raise an exception
except ExceptionType, e:
# handle the exception
```
在 Python 3.x 中,这个语法被更改为:
```python
try:
# some code that may raise an exception
except ExceptionType as e:
# handle the exception
```
这里,异常类型被指定为 `as` 关键字的参数,而不是 `,` 分隔符。
这些是 Python 2.x 和 Python 3.x 之间的一些主要区别。当迁移代码或选择使用哪个版本时,您应该考虑这些差异以及您的项目的需求。
### 回答2:
Python中的旧式类指的是不显式继承自`object`的类,而新式类则是显式继承自`object`的类。两者有以下特点:
1. 方法解析顺序不同:新式类采用广度优先搜索(BFS)的方法解析方法调用顺序,而旧式类采用深度优先搜索(DFS)的方法。这意味着新式类能够更准确地找到要调用的方法。
2. 属性访问顺序不同:新式类使用统一的属性访问机制,即先从实例中查找属性,再查找对应的类。而旧式类则只会在实例中查找属性。
举例说明:
```python
class OldClass:
def __init__(self, value):
self.value = value
def method(self):
print("This is a method from OldClass")
class NewClass(object):
def __init__(self, value):
self.value = value
def method(self):
print("This is a method from NewClass")
class InheritedClass(OldClass, NewClass):
pass
obj = InheritedClass(10)
print(obj.value) # 结果为 10,从实例中找到属性
obj.method() # 结果为 "This is a method from OldClass",按 DFS 解析方法调用顺序
print(isinstance(obj, OldClass)) # 结果为 True,obj 是旧式类的实例
print(isinstance(obj, NewClass)) # 结果为 True,obj 也是新式类的实例
print(isinstance(obj, InheritedClass)) # 结果为 True,obj 也是 InheritedClass 的实例
```
在这个例子中,`InheritedClass`同时继承了`OldClass`和`NewClass`。由于旧式类的方法解析顺序是按照深度优先搜索,所以在调用`obj.method()`时,解析到`OldClass`时就找到了对应的方法。而`obj.value`可以直接从实例中找到属性。
需要注意的是,从Python 3开始,不再存在旧式类,所有的类都默认是新式类。因此,旧式类的概念更适用于Python 2的环境。
阅读全文