网站首页 > 技术文章 正文
类的属性可以是其他类的实例。在面向对象编程里,把一个类的实例作为另一个类的属性,这是很常见的做法,这样能构建出更复杂、更具层次结构的对象模型。
下面通过一个示例来展示,假设已经有一个 Engine 类代表汽车发动机,还有一个 Car 类,此时可以把 Engine 类的实例作为 Car 类的一个属性。
# 定义 Engine 类,代表汽车发动机
class Engine:
def __init__(self, engine_type, horsepower):
"""
初始化发动机的属性
:param engine_type: 发动机类型
:param horsepower: 发动机马力
"""
self.engine_type = engine_type
self.horsepower = horsepower
def get_engine_info(self):
"""
返回发动机的信息
:return: 包含发动机类型和马力的字符串
"""
return f"发动机类型: {self.engine_type}, 马力: {self.horsepower}"
# 定义 Car 类,将 Engine 类的实例作为属性
class Car:
def __init__(self, make, model, year, engine):
"""
初始化汽车的属性
:param make: 汽车品牌
:param model: 汽车型号
:param year: 汽车生产年份
:param engine: 发动机实例,必须是 Engine 类的实例
"""
# 检查传入的 engine 是否为 Engine 类的实例
if not isinstance(engine, Engine):
raise ValueError("传入的 engine 必须是 Engine 类的实例")
self.make = make
self.model = model
self.year = year
self.engine = engine
def get_descriptive_name(self):
"""
返回汽车的描述性名称
:return: 包含汽车生产年份、品牌和型号的字符串,首字母大写
"""
long_name = f"{self.year} {self.make} {self.model}"
return long_name.title()
def get_car_info(self):
"""
打印汽车和发动机的信息
"""
print(f"汽车信息: {self.get_descriptive_name()}")
print(f"发动机信息: {self.engine.get_engine_info()}")
# 创建 Engine 类的实例
my_engine = Engine("V8", 400)
# 创建 Car 类的实例,将 Engine 实例作为属性传入
my_car = Car("Ford", "Mustang", 2024, my_engine)
# 调用 Car 类的方法获取汽车信息
my_car.get_car_info()
代码解释
- Engine 类:此为一个简单的类,代表汽车发动机,有 engine_type(发动机类型)和 horsepower(马力)这两个属性,还有一个 get_engine_info 方法用于返回发动机的信息。
- Car 类:Car 类的 __init__ 方法里有一个参数 engine,这个参数期望传入一个 Engine 类的实例。在 Car 类里,把 engine 当作一个属性,并且在 get_car_info 方法中调用 engine 实例的 get_engine_info 方法来获取发动机信息。
- 创建实例并调用方法:先创建了一个 Engine 类的实例 my_engine,接着创建 Car 类的实例 my_car 时,把 my_engine 作为参数传入。最后调用 my_car 的 get_car_info 方法,打印出汽车和发动机的信息。
通过这种方式,就实现了把一个类的实例作为另一个类的属性。
猜你喜欢
- 2025-06-23 抽象基类ABC,名字取的傻白甜,其实是Python进阶必会知识点
- 2025-06-23 Python最常见的170道面试题全解析答案(二)
- 2025-06-23 Python类中的self到底是干啥的(python类里面的self)
- 2025-06-23 Python面向对象编程入门指南:从零开始理解类与对象
- 2025-06-23 Python魔法函数(特殊函数)(python中魔术方法)
- 2025-06-23 一文读懂Python字段和属性(python中的属性)
- 2025-06-23 2025年AI工程师必知的15个Python库
- 2025-06-23 Python 属性界的 “双胞胎”:类属性 vs 实例属性,教你一眼辨明
- 2025-06-23 Python的实例属性和类属性(python类中属性)
- 2025-06-23 定义类和实例化对象概念及语法(定义类和实例化对象概念及语法关系)
- 06-24Python调用Docker API的使用方式(pycharm docker 调试)
- 06-24青少年Python编程系列28:Python中函数的递归调用
- 06-24python调用sqlite数据库案例(python 调用数据库)
- 06-24【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 06-24通过pybind11来实现python调用C++接口(一)
- 06-24Python编程调用Deepseek API创建智能体
- 06-24python多装饰器针对函数、类、方法的调用顺序说明
- 06-24Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- 270℃Python短文,Python中的嵌套条件语句(六)
- 268℃python笔记:for循环嵌套。end=""的作用,图形打印
- 266℃PythonNet:实现Python与.Net代码相互调用!
- 262℃Python实现字符串小写转大写并写入文件
- 261℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 121℃原来2025是完美的平方年,一起探索六种平方的算吧
- 101℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 95℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
-
- Python调用Docker API的使用方式(pycharm docker 调试)
- 青少年Python编程系列28:Python中函数的递归调用
- python调用sqlite数据库案例(python 调用数据库)
- 【Python机器学习系列】基于Flask来构建API调用机器学习模型服务
- 通过pybind11来实现python调用C++接口(一)
- Python编程调用Deepseek API创建智能体
- python多装饰器针对函数、类、方法的调用顺序说明
- Python Qt GUI设计:Python调用UI文件的两种方法(基础篇—3)
- Python | Django 外部脚本调用 models 数据库
- 自学Python第九天——操作列表(python操作步骤)
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)