From fa3f88b01fd4b167b13cb371b3ada424950ec9b9 Mon Sep 17 00:00:00 2001 From: Aaron Date: Mon, 15 Sep 2025 15:36:22 +0800 Subject: [PATCH] =?UTF-8?q?09-15-=E5=91=A8=E4=B8=80=5F15-36-22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 02.面向对象/04.封装与多态.md | 59 ++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/02.面向对象/04.封装与多态.md b/02.面向对象/04.封装与多态.md index 7c35a6e..e8399eb 100644 --- a/02.面向对象/04.封装与多态.md +++ b/02.面向对象/04.封装与多态.md @@ -13,41 +13,34 @@ python面向对象的三大特性:继承,封装,多态。 ## 封装 -第一步:将内容封装到某处 +Python中实现封装的方式包括: + +- **私有属性/方法**: + - 通过双下划线前缀(如`__name`)标记 + - 此类属性/方法仅在类内部可访问,外部无法直接调用(其实就是改名,`_类名__name` ); +- **公有方法**: + - 通过普通方法(如`get_name()`、`set_name()`)提供对私有属性的访问接口, + - 可在方法内加入数据验证(如确保年龄为正数); +- **`@property`装饰器**: + - 将方法转换为“只读属性”(如`@property def radius(self)`),或通过`@属性.setter`设置属性的修改规则(如`@radius.setter def radius(self, value)`) + - 实现更安全的属性访问。 ```python -class Foo: - def __init__(self,name,age): - self.name = name - self.age = age - -obj1 = Foo('张三',18) -obj2 = Foo('李四',16) +class BankAccount: + def __init__(self, balance): + self.__balance = balance # 私有属性,隐藏内部数据 + + def deposit(self, amount): + if amount > 0: + self.__balance += amount # 通过公有方法修改私有属性 + else: + raise ValueError("存款金额必须为正") + + def get_balance(self): + return self.__balance # 通过公有方法访问私有属性 ``` -第二步:从某处调用被封装的内容 - -```python -class Foo: - def __init__(self,name,age): - self.name = name - self.age = age - - def detail(self): - print(self.name) - print(self.age) - -obj1 = Foo('张三',18) -obj2 = Foo('李四',16) - -print(obj1.name) -print(obj2.age) -# 通过对象直接调用被封装的内容 - -obj1.detail() -obj2.detail() -# 通过self间接调用被封装的内容 -``` +封装避免了外部代码直接操作对象内部数据,提升了代码的安全性和可维护性 ## 多态 @@ -256,7 +249,7 @@ pay(w,100) # 到用的时候才会报错 总结: 约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种: -1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的 +1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#, 所以使⽤频率还是很少的 2. 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐) @@ -324,7 +317,7 @@ class Bar(A): class Info(Foo,Bar): def f1(self): - super(Foo,self).f1() + super(Foo,self).f1() # 关键:跳过Foo,从Bar开始查找f1 print('in Info f1') obj = Info()