09-15-周一_15-36-22
This commit is contained in:
@@ -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()
|
||||||
|
Reference in New Issue
Block a user