面向对象高级-封装

面向对象高级-封装

2026年9月20日·#编程学习/python学习笔记Python/面向对象·1146 字 6 分钟
浏览量加载中...
AI 摘要

封装的含义、类属性与实例属性、私有属性与私有方法的定义(__ 前缀)以及 Python 的"伪私有"机制

封装是什么#

封装就是把数据(属性)和操作数据的函数(方法)捆绑在一起,形成一个独立的单元(类),并隐藏内部的实现细节,只对外暴露必要的功能(方法)。

一句话:该让别人看的露出来,不该看的藏起来。

类属性与实例属性#

class Car:
# 类属性:所有实例对象共享的
wheel = 4 # 轮胎数量
tax_rate = 0.1 # 购置税税率
def __init__(self, c_color, c_brand, c_name):
# 实例属性:每个对象各自一份
self.color = c_color
self.brand = c_brand
self.name = c_name
def start(self):
print(f'{self.brand} {self.name} 正在启动...')
def stop(self):
print(f'{self.brand} {self.name} 停止行驶...')
类型写在哪特点
类属性类体里、方法外所有实例共享(如 wheel = 4
实例属性__init__ 里用 self.xxx每个对象各有一份(如 self.color

私有属性与私有方法#

class Car:
def __init__(self, c_color, c_brand, c_name, c_owner):
self.color = c_color
self.brand = c_brand
self.name = c_name
self.__owner = c_owner # 私有属性:名字前加 __
def start(self):
print(f'{self.brand} {self.name} 正在启动...')
def run(self):
print(f'{self.__owner} : {self.brand} {self.name} 正在行驶...')
self.__control_fuel() # 类的内部可以调用私有方法
def __control_fuel(self): # 私有方法:名字前加 __
print(f'{self.brand} {self.name} 正在控制燃油分配...')
def get_owner(self): # 对外暴露一个"脱敏"的读取方式
return self.__owner[0:1] + "**"
公共属性/方法私有属性/方法
定义方式直接写名字名字前加 两个下划线 __
类的内部可以访问可以访问
类的外部可以访问不能访问
应用场景对外功能不想对使用者公开的内部实现
Important

Python 中并没有真正的私有机制,只是”约定”:名字前加 __ 的属性会被改名成 _类名__属性名,所以在外面写 car._Car__owner 依然能访问到——但不要这么干,那等于绕过约定。

Tip

私有属性不是”藏起来就完事”,而是要提供安全的对外接口。比如例子里的 get_owner() 返回脱敏后的名字(涛哥涛**),既满足了外部需求,又不泄露完整信息。

相关#

练习题#

一、回忆填空(写完再展开对答案)#

  1. 封装就是把 ____ 和操作数据的 ____ 捆绑在一起,形成独立的类,并隐藏内部实现细节
  2. 所有实例共享的属性叫 ____ 属性(写在类体里、方法外);每个对象各有一份的叫 ____ 属性(写在 ____ 方法里)
  3. 私有属性/方法的名字前要加 ____;它们只能在类的 ____ 使用
  4. Python ____(有/没有)真正的私有机制,它只是一种 ____
  5. 私有属性被改名后的形式是 ____类名__属性名
  6. 想让外部安全地读取私有属性,正确做法是提供 ____
填空答案(做完再点开)
  1. 数据(属性)/ 函数(方法) 2. 类 / 实例 / __init__ 3. 两个下划线 __ / 内部 4. 没有 / 约定 5. _ 6. 对外暴露的公共方法(如 get_owner()

二、裸写题#

  • 2-1 写一个带私有属性的类 定义 BankAccount 类:私有属性 __balance(余额),提供 deposit(金额) 存钱、get_balance() 查余额两个公共方法。

    提示(先自己想,实在想不出再点开)

    一级 · 思路:余额设为私有,只通过方法修改和读取 二级 · 方法self.__balance__init__ 里初始化 三级 · 骨架def deposit(self, amount): self.__balance += amount

  • 2-2 验证”私有”并不真私有 在类外面分别尝试访问 __balance_类名__balance,观察两者的结果并解释原因。

    提示

    一级 · 思路:直接用点号访问私有属性会报错,但加上类名前缀就”绕”过去了 二级 · 方法account.__balance(报 AttributeError)/ account._BankAccount__balance 三级 · 骨架:用 try/except 捕获 AttributeError 打印提示

  • 2-3 提供脱敏接口BankAccount 加一个方法,返回脱敏后的账户信息(比如卡号只留后 4 位)。

    提示

    一级 · 思路:私有属性做到”内部完整、对外脱敏” 二级 · 方法:字符串切片 card[-4:] 三级 · 骨架return "****" + self.__card[-4:]

参考答案(做完再点开)
class BankAccount:
def __init__(self, card, balance):
self.__card = card # 私有:卡号
self.__balance = balance # 私有:余额
def deposit(self, amount):
if amount <= 0:
print("存款金额必须大于 0")
return
self.__balance += amount
print(f"存款成功,当前余额:{self.__balance}")
def get_balance(self):
return self.__balance
def get_card_info(self): # 脱敏接口
return "****" + self.__card[-4:]
account = BankAccount("6222021234567890", 100)
account.deposit(50)
print(account.get_balance()) # 150
print(account.get_card_info()) # ****7890
# 2-2:私有并不真私有
try:
print(account.__balance)
except AttributeError as e:
print("直接访问私有属性失败:", e) # 报错
print(account._BankAccount__balance) # 150(能"绕"进去,但不建议这么做)

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# Ajax2# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc3# CSS6# DeepSeek6# deepseek2# DELETE1# Docker1# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML6# HTTP5# ImageManager1# Java23# java13# JavaScript5# JDBC3# JSON2# JUnit1# LangChain25# Logback1# Maven6# Muse Spark1# Mybatis1# MyBatis4# MySQL28# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python65# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot11# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue7# Waline3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端32# 动态1# 动漫1# 包1# 单词2# 博客7# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 对象1# 导航栏1# 工具2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程1# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常92# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试1# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]