類之間的依賴關系和組合關系
依賴(關聯)關系
類之間可以有三種關系:
- 依賴(關聯)關系
- 組合(聚合)關系
- 繼承(實現)關系
依賴(關聯)關系指的是類對象執行某個動作的時候,需要其他類的對象來幫助完成這個操作的情況,其特點為:
- 將一個類的對象或者類名傳到另一個類的方法中使用
- 此時的關系是最輕的,隨時可以更換其他對象
關聯關系的示例如下:
class Person:
def play(self, tools):
tools.run()
print('我要打游戲了')
class Computer:
def run(self):
print('電腦已經打開,DNF已經登陸')
class Phone:
def run(self):
print('王者榮耀已經登陸')
xiaoming = Person()
xmPhone = Phone()
hwComp = Computer()
xiaoming.play(xmPhone)
xiaoming.play(hwComp)
輸出的結果為:
王者榮耀已經登陸
我要打游戲了
電腦已經打開,DNF已經登陸
我要打游戲了
在這里補充兩個刪除對象的方法:
delattr(對象名, '屬性名') # 動態刪除時比較常用
del 對象名.屬性名
del
和 delattr
功能有限,只能刪除實例屬性,不能刪除類屬性:
class GirlFriend:
name = '小麗麗'
eye_num = 2
sex = '女'
def __init__(self, name, age):
self.name = name
self.age = age
def chui_tui(self, num):
print(f'{self.name}給大哥捶{num}次腿')
self.love = True
xiaoli = GirlFriend('小麗', 16)
xiaohong = GirlFriend('小紅', 17)
del xiaoli.age
delattr(xiaohong, 'age')
print(xiaoli.__dict__)
print(xiaohong.__dict__)
組合(聚合)關系
組合(聚合)關系是對象里包含對象的關系:
- 將一個類的對象封裝到另一個類的對象的屬性中,就叫組合
- 一對一關系
- 一對多關系
一對一關系示例:
class BigB:
def __init__(self, name, girl_friend=None):
self.name = name
self.girl_friend = girl_friend
def eat(self):
if self.girl_friend:
print(f'{self.name}帶着他的女朋友{self.girl_friend.name}去吃飯')
else:
print('單身狗,吃狗糧!')
def movie(self):
if self.girl_friend:
print(f'{self.name}帶着他的女朋友{self.girl_friend.name}去看電影')
else:
print('單身狗不陪看電影!')
class Girl:
def __init__(self, name):
self.name = name
bao = BigB('寶元')
friend = Girl('唐藝昕')
bao.eat()
bao.movie()
bao.girl_friend = friend
bao.eat()
bao.movie()
輸出的結果為:
單身狗,吃狗糧!
單身狗不陪看電影!
寶元帶着他的女朋友唐藝昕去吃飯
寶元帶着他的女朋友唐藝昕去看電影
一對多的組合關系
同一對一的組合關系類似,我們可以將多個類的對象封裝為另一個類的屬性,具體示例為:
# 有一個男孩類和一個女孩類,男孩類中包含多個女孩類的對象
class Boy:
def __init__(self, name):
self.name = name
self.girl_f = []
def ba_mei(self, girl):
self.girl_f.append(girl)
def happy(self):
for i in self.girl_f:
i.play()
class Girl:
def __init__(self, name):
self.name = name
def play(self):
print(f'{self.name}陪你一起玩~o(=•ェ•=)m')
xiaoqiang = Boy('小強')
xiaohong = Girl('小紅')
xiaoli = Girl('小麗')
xiaofei = Girl('小菲')
xiaoqiang.ba_mei(xiaohong)
xiaoqiang.ba_mei(xiaoli)
xiaoqiang.ba_mei(xiaofei)
xiaoqiang.happy()
輸出的結果為:
小紅陪你一起玩~o(=•ェ•=)m
小麗陪你一起玩~o(=•ェ•=)m
小菲陪你一起玩~o(=•ェ•=)m
組合關系與依賴關系的區別在於,組合關系是將類對象封裝為新類的屬性來使用,而依賴關系則是將類對象作為參數傳給新類的方法使用。
一對多練習:
創建教師類和學生類
• 教師類有姓名和學生列表兩個屬性
• 教師類有添加學生的方法(添加的學生是具體對象)
• 教師類有顯示對應學生姓名和學號的方法
• 學生類有學號/姓名/教師姓名三個屬性
• 創建多個學生,並添加到某位教師的學生列表中
• 打印該教師的學生
參考代碼如下:
class Teacher:
def __init__(self, name):
self.name = name
self.student_list = []
def add_student(self, *student): # student前加了*,為了能一次性接收多個實例對象,方便后續使用
self.student_list.extend(student)
for j in student:
j.teacher = self.name
def show_student(self):
for i in self.student_list:
print(f'姓名:{i.name},學號:{i.student_id}')
class Student:
def __init__(self, name, student_id):
self.name = name
self.student_id = student_id
self.teacher = None
alex = Teacher('Alex')
bigB = Teacher('寶元')
xiaoming = Student('小明', 123)
xiaoqiang = Student('小強', 234)
xiaohong = Student('小紅', 345)
xiaoli = Student('小麗', 456)
xiaohu = Student('小虎', 135)
alex.add_student(xiaoming ,xiaoli)
bigB.add_student(xiaoqiang, xiaohong, xiaohu)
alex.show_student()
bigB.show_student()
print(xiaoming.teacher)
print(xiaoqiang.teacher)
需要注意,使用組合關系時,要盡量避免兩個或多個類之間混合使用彼此的類對象作為自己的類屬性,這樣會陷入循環調用的麻煩中,容易引發混亂。