【学Python自动化】 9.1 Python 与 Rust 类机制对比学习笔记
一、类的基本概念
Python 类
Python 的类使用简洁的语法,支持面向对象编程的所有特性:
-
使用 class 关键字定义
-
支持多重继承
-
所有方法都是虚方法(virtual)
-
方法的第一个参数是 self(约定)
-
动态特性:运行时创建和修改
class MyClass:"""一个简单的示例类"""i = 12345 # 类变量def f(self):return 'hello world'
Rust 结构体和实现
Rust 没有传统的"类",但使用结构体(struct)和实现块(impl)实现类似功能:
-
使用 struct 定义数据结构
-
使用 impl 块定义方法
-
更严格的访问控制和所有权机制
-
支持特质(trait)实现多态
// 结构体定义
struct MyClass {i: i32, // 实例字段
}// 实现块
impl MyClass {// 关联函数(类似静态方法)fn new() -> Self {Self { i: 12345 }}// 方法,第一个参数是 &selffn f(&self) -> String {"hello world".to_string()}
}### 二、命名空间和作用域
Python+ 使用字典实现命名空间+ 动态作用域解析+ 支持 global 和 nonlocal 关键字Rust+ 静态作用域和生命周期管理+ 模块系统提供命名空间+ 无全局变量,使用静态项或常量### 三、类定义和实例化
Python 实例化
```pythonx = MyClass() # 创建实例
x.i = 10 # 动态添加属性
Rust 实例化
let x = MyClass { i: 10 }; // 创建实例
// x.i = 20; // 错误:默认不可变
let mut x = MyClass { i: 10 }; // 可变实例
x.i = 20; // 允许修改
1 方法和属性
Python 方法
class MyClass:def __init__(self, value): # 构造函数self.data = valuedef method(self): # 实例方法return self.data
Rust 方法
struct MyClass {data: i32,
}impl MyClass {// 关联函数(类似构造函数)fn new(value: i32) -> Self {Self { data: value }}// 方法,借用 selffn method(&self) -> i32 {self.data}// 可变方法,可变借用 selffn set_data(&mut self, value: i32) {self.data = value;}// 获取所有权的方法fn consume(self) -> i32 {self.data}
}
2 类和实例变量
Python 类变量和实例变量
class Dog:kind = 'canine' # 类变量(所有实例共享)def __init__(self, name):self.name = name # 实例变量
Rust 静态字段和实例字段
struct Dog {name: String, // 实例字段
}impl Dog {// 静态关联函数fn kind() -> &'static str {"canine"}fn new(name: &str) -> Self {Self { name: name.to_string() }}
}
三、继承和多态
Python 继承
class Base:def method(self):return "base method"class Derived(Base):def method(self):return "derived method"
Rust 使用特质实现多态
// 定义特质
trait Base {fn method(&self) -> String;
}// 为结构体实现特质
struct Derived;impl Base for Derived {fn method(&self) -> String {"derived method".to_string()}
}
四、访问控制和私有性
Python 私有约定
class MyClass:def __init__(self):self._protected = "protected" # 约定保护self.__private = "private" # 名称改写
Rust 显式访问控制
mod my_module {pub struct MyClass {pub public_field: i32, // 公开protected_field: i32, // 模块内可见(默认)}impl MyClass {pub fn new() -> Self {Self { public_field: 1, protected_field: 2 }}}
}
五、迭代器和生成器
Python 迭代器和生成器
# 迭代器
class Reverse:def __init__(self, data):self.data = dataself.index = len(data)def __iter__(self):return selfdef __next__(self):if self.index == 0:raise StopIterationself.index -= 1return self.data[self.index]# 生成器
def reverse(data):for i in range(len(data)-1, -1, -1):yield data[i]
Rust 迭代器
// 实现迭代器特质
struct Reverse<'a> {data: &'a [char],index: usize,
}impl<'a> Reverse<'a> {fn new(data: &'a [char]) -> Self {Self { data, index: data.len() }}
}impl<'a> Iterator for Reverse<'a> {type Item = char;fn next(&mut self) -> Option<Self::Item> {if self.index == 0 {None} else {self.index -= 1;Some(self.data[self.index])}}
}
六、关键差异总结
特性 | Python | Rust |
---|---|---|
类定义 | class 关键字 | struct + impl |
继承 | 直接支持多重继承 | 通过特质(trait)实现 |
多态 | 动态分发(运行时) | 静态分发(编译时)或特质对象 |
访问控制 | 命名约定(和_) | 显式 pub 关键字 |
方法定义 | 显式 self 参数 | 隐式 self(&self, &mut self, self) |
内存管理 | 垃圾回收 | 所有权系统和借用检查器 |
迭代器 | 协议(iter, next) | Iterator 特质 |
Rust 的面向对象编程更加显式和严格,强调编译时安全和性能,而 Python 提供了更大的灵活性和动态性。