面向对象中的封装原理与实现
1. 封装核心概念
面向对象编程通过封装实现数据与行为的整合,其本质是对内部状态的保护与对外接口的控制。
2.1 封装机制
封装包含两层含义:数据隐藏与接口暴露。通过限制外部直接访问,确保数据安全性并提供可控操作方式。
2.2 实现目标
- 屏蔽内部实现细节
- 防止非法数据修改
- 增强代码可维护性
3. 属性隐藏技术
3.1 双下划线机制
Python通过双下划线实现属性私有化,实际会转换为_类名__属性名形式。例如:
class Student:
__institution = 'MIT'
def __init__(self, name, age):
self.__name = name
self.age = age
def show_info(self):
print(f'{self.__name} - {self.__institution}')
3.2 访问限制
外部可通过类名._类名__属性名访问私有属性,但该机制并非绝对安全:
print(Student._Student__institution) # 可绕过访问限制
4. 接口设计规范
4.1 数据访问控制
通过setter方法实现数据校验与修改:
class Student:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
if len(value) > 3:
raise ValueError('名称长度限制')
self.__name = value
4.2 方法封装示例
ATM机取款流程封装:
class ATM:
def __insert_card(self):
print('插入银行卡')
def __withdraw(self, amount):
print(f'取出{amount}元')
def process(self):
self.__insert_card()
self.__withdraw(100)
5. property属性应用
5.1 BMI计算示例
使用property实现数据属性伪装:
class Person:
def __init__(self, height, weight):
self.__height = height
self.__weight = weight
@property
def bmi(self):
return self.__weight / (self.__height ** 2)
5.2 完整属性控制
结合setter/deleter实现全功能控制:
class Student:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
if not value.isalpha():
raise ValueError('仅支持字母')
self.__name = value
@name.deleter
def name(self):
del self.__name