Files
python-book/02.面向对象/02.类空间与类之间的关系.md
2025-09-15 11:12:16 +08:00

319 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 类空间与类之间的关系
## 类的空间问题
### 添加对象属性
```python
class A:
def __init__(self,name):
self.name = name
def func(self,sex):
self.sex = sex
```
在类外部添加
```python
class A:
def __init__(self,name):
self.name = name
def func(self,sex):
self.sex = sexa
obj = A('zhangsan')
obj.age = 18
print(obj.__dict__)
```
类的内部添加
```python
class A:
def __init__(self,name):
self.name = name
def func(self,sex):
self.sex = sex
obj = A('zhangsan')
obj.func('男')
print(obj.__dict__)
```
**总结:对象的属性不仅可以在`__init__` 里面添加,还可以在类的其他方法或者类的外面添加。**
### 添加类的静态属性
```python
class A:
def __init__(self,name):
self.name = name
def func(self,sex):
self.sex = sex
def func1(self):
A.bbb = self
A.aaa = 'test' # 类的外部添加
print(A.__dict__)
A.func1('123') # 类的内部添加
print(A.__dict__)
```
**总结:类的属性不仅可以在类内部添加,还可以在类的外部添加**
## 对象如何找到类的属性
对象空间
1. 产生这个对象空间,并有一个类对象指针
2. 执行`__init__`方法,给对象封装属性
对象查找属性的顺序:先从对象空间找 ------> 类空间找 ------> 父类空间找 ------->.....
类名查找属性的顺序:先从本类空间找 -------> 父类空间找--------> ........
上面的顺序都是单向不可逆,类名不可能找到对象的属性。
## 类与类之间的关系
类与类中存在以下关系:
1. 依赖关系
2. 关联关系
3. 组合关系
4. 聚合关系
5. 实现关系
6. 继承关系(类的三大特性之一:继承。)
### 依赖关系
例:将大象装进冰箱,需要两个类, ⼀个是⼤象类, ⼀个是冰箱类
```python
class Elphant:
def __init__(self,name):
self.name = name
def open(self):
'''
开门
'''
pass
def close(self):
'''
关门
'''
pass
class Refrigerator:
def open_door(self):
print('冰箱门打开了')
def open_door(self):
print('冰箱门关上了')
```
将大象类和冰箱类进行依赖
```python
class Elphant:
def __init__(self,name):
self.name = name
def open(self,obj1):
'''
开门
'''
print(self.name,'要开门了')
obj1.open_door()
def close(self):
'''
关门
'''
pass
class Refrigerator:
def open_door(self):
print('冰箱门打开了')
def close_door(self):
print('冰箱门关上了')
elphant1 = Elphant('大象')
haier = Refrigerator()
elphant1.open(haier)
```
### 关联,聚合,组合关系
其实这三个在代码上写法是⼀样的. 但是, 从含义上是不⼀样的.
1. 关联关系. 两种事物必须是互相关联的. 但是在某些特殊情况下是可以更改和更换的.
2. 聚合关系. 属于关联关系中的⼀种特例. 侧重点是xxx和xxx聚合成xxx. 各⾃有各⾃的声明周期. 比如电脑. 电脑⾥有CPU, 硬盘, 内存等等. 电脑挂了. CPU还是好的. 还是完整的个体
3. 组合关系. 属于关联关系中的⼀种特例. 写法上差不多. 组合关系比聚合还要紧密. 比如⼈的⼤脑, ⼼脏, 各个器官. 这些器官组合成⼀个⼈. 这时. ⼈如果挂了. 其他的东⻄也跟着挂了
**关联关系**
```python
class Boy:
def __init__(self, name, girlFirend=None):
self.name = name
self.girlFriend = girlFirend
def have_a_dinner(self):
if self.girlFriend:
print('%s%s 一起晚饭' % (self.name, self.girlFriend.name))
else:
print('单身狗,吃什么饭')
class Girl:
def __init__(self, name):
self.name = name
b = Boy('张三')
b.have_a_dinner()
b.girlFriend = Girl('如花')
b.have_a_dinner()
gg = Girl('花花')
bb = Boy('李四', gg)
bb.have_a_dinner()
```
注意. 此时Boy和Girl两个类之间就是关联关系. 两个类的对象紧密联系着. 其中⼀个没有了. 另⼀个就孤单的不得了. 关联关系, 其实就是 我需要你. 你也属于我
学校和老师之间的关系
```python
class School:
def __init__(self,name,address):
self.name = name
self.address = address
class Teacher:
def __init__(self,name,school):
self.name = name
self.school = school
s1 = School('北京校区','北京')
s2 = School('上海校区','上海')
s3 = School('深圳校区','深圳')
t1 = Teacher('张老师',s1)
t2 = Teacher('李老师',s2)
t3 = Teacher('王老师',s3)
print(t1.school.name)
print(t2.school.name)
print(t3.school.name)
```
但是学校也是依赖于老师的,所以老师学校应该互相依赖。
```python
class School:
def __init__(self, name, address):
self.name = name
self.address = address
self.teacher_list = []
def append_teacher(self, teacher):
self.teacher_list.append(teacher)
class Teacher:
def __init__(self, name, school):
self.name = name
self.school = school
school.append_teacher(self)
s1 = School('北京校区', '北京')
s2 = School('上海校区', '上海')
s3 = School('深圳校区', '深圳')
t1 = Teacher('张老师', s1)
t2 = Teacher('李老师', s1)
t3 = Teacher('王老师', s3)
print(s1.teacher_list)
print(f"{s1.name} 校区,老师的名单如下:")
for teacher in s1.teacher_list:
print(teacher.name)
```
**组合:将一个类的对象封装到另一个类的对象的属性中,就叫组合。**
例:设计一个游戏,让游戏里面的人物互殴
```python
class Gamerole:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p1):
p1.hp -= self.ad
print('%s攻击%s,%s掉了%s血,还剩%s'%(self.name,p1.name,p1.name,self.ad,p1.hp))
man = Gamerole('人',10,100)
dog = Gamerole('狗',50,100)
dog.attack(man)
man.attack(dog)
```
加上一个武器类,让人使用武器攻击
```python
class Gamerole:
def __init__(self,name,ad,hp):
self.name = name
self.ad = ad
self.hp = hp
def attack(self,p1):
p1.hp -= self.ad
print('%s攻击%s,%s掉了%s血,还剩%s'%(self.name,p1.name,p1.name,self.ad,p1.hp))
def equip_weapon(self,wea):
self.wea = wea
class Weapon:
def __init__(self,name,ad):
self.name = name
self.ad = ad
def weapon_attack(self,p1,p2):
p2.hp = p2.hp - self.ad - p1.ad
print('%s利用%s攻击了%s%s还剩%s血'%(p1.name,self.name,p2.name,p2.name,p2.hp))
man = Gamerole('人',10,100)
dog = Gamerole('狗',50,100)
stick = Weapon('木棍',40)
man.equip_weapon(stick)
man.wea.weapon_attack(man,dog)
# 人利用木棍攻击了狗狗还剩50血
```