日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【面向对象编程】(3) 类之间的交互,依赖关系,关联关系

發布時間:2023/11/27 生活经验 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【面向对象编程】(3) 类之间的交互,依赖关系,关联关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

各位同學好,今天和大家分享一下面向對象編程中,類之間的交互,類之間的依賴關系和關聯關系。有不明白的可見前一章節:https://blog.csdn.net/dgvv4/article/details/122297834?spm=1001.2014.3001.5501

1. 類之間的交互

定義兩個類,通過在每個類中定義的方法來進行實例之間的交互。

以人打狗,狗咬人為例。在 Dog 類中定義了一個?bite?函數,第一個參數 self 是該類的實例化對象本身,第二個參數 person 是另一個類的實例化對象,其中?self.attack_val 調用的是該類的實例的 attack_val 屬性的值,person.life_val 調用的是 person 實例的?life_val 屬性的值。計算后直接改變了?person.life_val 對應的值。

#(1)定義第一個類
class Dog:attack_val = 30  # 類屬性,攻擊力# 初始化,指定傳入的屬性值的數據類型def __init__(self, name:str, breed: str, life_val=100):# 當傳入的屬性值不滿足條件就報錯,報錯內容是逗號后面的assert life_val >= 0, f"life_val {life_val} is smaller than 0"# 分配屬性self.name = nameself.breed = breedself.life_val = life_val# 定義類方法,與第二個類的交互def bite(self, person):  # 傳入prison實例 # 改變實例'person'的生命值 person.life_val -= self.attack_val#(2)定義第二個類
class Person:attack_val = 50  # 定義類屬性,攻擊力# 初始化,指定傳入的屬性值的數據類型def __init__(self, name:str, sex:str, life_val=100):# 當傳入的屬性值不滿足條件就報錯,報錯內容是逗號后面的assert life_val >= 0, f"life_val {life_val} is smaller than 0"# 分配屬性self.name = nameself.sex = sexself.life_val = life_val# 定義類方法,和第一個類之間的交互def attack(self, dog):  # 傳入第一個類實例dog# 改變對象dog的life_val屬性dog.life_val -= self.attack_val#(3)對兩個類分別實例化,傳入初始化的屬性值
person = Person('小強', 'male', 100)
dog = Dog('老黑', '柯基', 60)#(4)兩個類之間的交互
# 實例'person'攻擊實例'dog'
person.attack(dog)  # 第一個參數self是實例person,只需要傳入第二個參數
print('dog life value: ', dog.life_val)  # 60-50 = 10# 實例'dog'攻擊實例'person'
dog.bite(person) # 第一個參數self默認是實例dog
print('person life value:', person.life_val) # 100-30 = 70


2. 類之間的依賴關系

一個類可以調用另一個類中的屬性初始化時,在一個類中傳入第二個類的實例化對象,這樣的話,第一個類可以調用第二個類中的屬性。

如下面代碼中,在 person 類初始化中傳入一個屬性 weapon該屬性是一個類實例化對象。在分配屬性時接收這個對象?self.weapon = weapon,這樣的話,Person 類的實例化對象 person 就可以調用 weapon 對象的所有屬性。其中?self.weapon.name 就是通過實例 person 調用實例weapon,再調用它的屬性 name,得出結果。

#(1)定義類
class Person:   life_val = 100  # 類屬性#(2)初始化,self為實例化對象def __init__(self, name:str, sex:str, life_val:int, weapon):  # weapon是另一個實例化對象# 分配屬性self.name = nameself.sex = sexself.life_val = life_valself.weapon = weapon   # 依賴關系,'person'實例可以調用'weapon'實例中的屬性 self.claim()  # 在初始化時調用自己的方法# 定義類方法def claim(self):# 打印該類的相關信息print(f'{self.name} use {self.weapon.name}, the attack is {self.weapon.attack_val}')# 阿強 use gun, the attack is 90#(3)定義第二個類
class Weapon:# 初始化,指定各個屬性值的數據類型def __init__(self, name:str, attack_val:int):# 分配屬性self.name = nameself.attack_val = attack_val#(4)類實例化
weapon = Weapon('gun', 90)  # 實例化Weapon類,傳入屬性值
person = Person('阿強', 'male', 100, weapon)  # 實例化person類,傳入屬性值,以及另一個實例化對象

3. 關聯關系

兩個類可以相互調用雙方的屬性。同樣,兩個類實例化對象都可以調用彼此的屬性。

3.1 方法一:在屬性分配時確定關系

在類的初始化時不傳入另一個實例,而在分配屬性時設置一個屬性存放該類實例化對象的關聯對象,先將其設為None,self.opponent = None。完成類實例化對象之后,就可以將該屬性指定為另一個對象,如:person1.opponent = person2 ,這樣的話,實例 person1 就可以通過屬性 opponent 調用實例 person2 中的所有屬性。同理,需要將 person2.opponent = person1 才能完成兩個實例之間的關聯關系。

如:person2.opponent.name,就是通過實例 person2 調用其屬性 opponent ,此時?person2.opponent 就是代表實例?person1,再調用其屬性 name

解除關聯關系的方法,同時將雙方的 opponent 屬性變成 None。

#(1)定義一個類
class Person:  life_val = 100  # 定義類屬性    #(2)初始化,傳入屬性值,屬性attack_val默認為10def __init__(self, name, age, attack_val=10):# 屬性分配self.name = nameself.age = ageself.attack_val = attack_val#(3)用于關聯兩個對象,兩個對象可以相互使用對方的屬性self.opponent = None  # 因為第一個實例化沒有關聯對象,需要等所有實例化完成之后在修改        #(4)類實例化對象,傳入屬性值
person1 = Person('阿強', 18, 50)
person2 = Person('阿珍', 30, 20)#(5)將兩個實例關聯起來
person1.opponent = person2  # 實例person1可以使用實例person2的屬性
person2.opponent = person1  # 實例person2可以使用實例person1的屬性#(6)打印結果
print(f"{person1.name} 's opponent is {person1.opponent.name}, her attack_val is {person1.opponent.attack_val}")
# 阿強 's opponent is 阿珍, her attack_val is 20
print(f"{person2.name} 's opponent is {person2.opponent.name}, his life_val is {person2.opponent.life_val}")
# 阿珍 's opponent is 阿強, his life_val is 100#(7)解除兩個實例之間的關聯關系
# 將聯系雙方的屬性值變成None
person1.opponent = None
person2.opponent = None

3.2 方法二:重寫一個新類確定關聯關系

在外部定義一個新的類 Relation,用于存放兩個實例之間的關系。在初始化時,只需要定義一個空列表,代表兩個實例之間不存在關聯關系。定義兩個方法用于確定關聯關系和解除關系。

在定義的 Person 類中,初始化需要傳入兩個實例間的關系,用 relation 屬性來接收它 self.relation = relation,初始為空,這樣的話,就可以通過 relation 屬性來調用 Relation 類中的所有方法。

確定關聯關系?relation.make_couple(person1, person2),通過 relation 實例調用 make_couple() 方法,該方法傳入兩個實例,以列表的形式將兩個實例保存在 relation 實例的 couple 屬性中。?其中,person1.relation.couple[1].name,是通過 person1 實例調用 person2 實例中的 name 屬性的值。person1.relation 調用的是實例 relationperson1.relation.couple[1] 是調用的實例 person2

解除關系?relation.break_couple(),通過實例 relation 調用方法 break_couple(),將關系列表變為空。

#(1)統一在一個類中規定兩個實例是否能相互調用對方的屬性
class Relation:# 初始化def __init__(self):# 存放兩個實例的關聯狀態self.couple = []# 定義方法,將兩個實例傳進來def make_couple(self, obj1, obj2):# 將兩個實例保存到列表中print('生成關聯關系')self.couple = [obj1, obj2]# 解除關聯關系def break_couple(self):# 將列表清空print('解除關聯關系')self.couple = []#(2)定義類,如果兩個實例之間是關聯關系,那么相互之間可以使用對方的屬性
class Person:life_val = 100# 初始化,將確定關系的實例輸入def __init__(self, name, age, attack_val, relation):# 分配屬性self.name = nameself.age = ageself.attack_val = attack_valself.relation = relation  # 將另一個實例作為本實例的屬性#(3)類實例化對象
relation = Relation()
person1 = Person('阿強', 18, 50, relation)
person2 = Person('阿珍', 30, 20, relation)
# 這里relation.couple還只是一個空列表#(4)關聯兩個對象,相互使用對方的屬性
relation.make_couple(person1, person2)#(5)這時兩個實例就可以相互調用對方的屬性
print(f"{person1.name} 's opponent is {person1.relation.couple[1].name}, \
her attack is {person1.relation.couple[1].attack_val}")
# 阿強 's opponent is 阿珍, her attack is 20#(6)一次性解除兩個實例之間的關聯關系
relation.break_couple()
# 或 person1.relation.break_couple()

總結

以上是生活随笔為你收集整理的【面向对象编程】(3) 类之间的交互,依赖关系,关联关系的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。