09-15-周一_15-36-22

This commit is contained in:
2025-09-15 15:36:22 +08:00
parent 0beaf242c4
commit fa3f88b01f

View File

@@ -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 ```python
class Foo: class BankAccount:
def __init__(self,name,age): def __init__(self, balance):
self.name = name self.__balance = balance # 私有属性,隐藏内部数据
self.age = age
def deposit(self, amount):
obj1 = Foo('张三',18) if amount > 0:
obj2 = Foo('李四',16) 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中约束的⽅式和⽅法有两种: 总结: 约束. 其实就是⽗类对⼦类进⾏约束. ⼦类必须要写xxx⽅法. 在python中约束的⽅式和⽅法有两种:
1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#. 所以使⽤频率还是很少的 1. 使⽤抽象类和抽象⽅法, 由于该⽅案来源是java和c#, 所以使⽤频率还是很少的
2. 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐) 2. 使⽤⼈为抛出异常的⽅案. 并且尽量抛出的是NotImplementError. 这样比较专业, ⽽且错误比较明确.(推荐)
@@ -324,7 +317,7 @@ class Bar(A):
class Info(Foo,Bar): class Info(Foo,Bar):
def f1(self): def f1(self):
super(Foo,self).f1() super(Foo,self).f1() # 关键跳过Foo从Bar开始查找f1
print('in Info f1') print('in Info f1')
obj = Info() obj = Info()