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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

02 面向对象之:类空间问题以及类之间的关系

發布時間:2025/6/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 02 面向对象之:类空间问题以及类之间的关系 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 類的空間問題

1.1 何處可以添加對象屬性

class A:def __init__(self,name):self.name = namedef func(self,sex):self.sex = sex # 類外面可以: obj = A('barry') obj.age = 18 print(obj.__dict__) # {'name': 'barry', 'age': 18}# 類內部也可以: obj = A('barry') # __init__方法可以。 obj.func('') # func 方法也可以。

總結:對象的屬性不僅可以在__init__里面添加,還可以在類的其他方法或者類的外面添加。

1.2 何處可以添加類的靜態屬性

class A:def __init__(self,name):self.name = namedef func(self,sex):self.sex = sexdef func1(self):A.bbb = 'ccc' # 類的外部可以添加 A.aaa = 'taibai' print(A.__dict__)# 類的內部也可以添加。 A.func1(111) print(A.__dict__)

總結:類的屬性不僅可以在類內部添加,還可以在類的外部添加。

1.3 對象如何找到類的屬性

之前咱們都學習過,實例化一個對象,可以通過點的方式找到類中的屬性,那么他為什么可以找到類中的屬性呢?

通過圖解說明:

對象查找屬性的順序:先從對象空間找? ------> 類空間找 ------> 父類空間找 ------->.....

類名查找屬性的順序:先從本類空間找 -------> 父類空間找--------> ........

上面的順序都是單向不可逆,類名不可能找到對象的屬性。

?二. 類與類之間的關系

?千世界, 萬物之間皆有規則和規律. 我們的類和對象是對?千世界中的所有事物進?歸類. 那事物之間存在著相對應的關系. 類與類之間也同樣如此. 在?向對象的世界中. 類與類中存在以下關系:

1. 依賴關系
2. 關聯關系
3. 組合關系
4. 聚合關系
5. 實現關系
6. 繼承關系(類的三大特性之一:繼承。)

2.1 依賴關系

?先, 我們設計?個場景. 還是最初的那個例?. 要把?象裝冰箱. 注意. 在這個場景中, 其實是存在了兩種事物的. ?個是?象, ?象負責整個事件的掌控者, 還有?個是冰箱, 冰箱負責被?象操縱.?

?先, 寫出兩個類, ?個是?象類, ?個是冰箱類

class Elphant:def __init__(self, name):self.name = namedef open(self):'''開?'''passdef close(self):'''關?'''passclass Refrigerator:def open_door(self):print("冰箱?被打開了")def close_door(self):print("冰箱?被關上了")

  冰箱的功能非常簡單, 只要會開?, 關?就?了. 但是?象就沒那么簡單了. 想想. ?象開?和關?的時候是不是要先找個冰箱啊. 然后呢? 打開冰箱?. 是不是打開剛才找到的那個冰箱?. 然后裝??. 最后呢? 關冰箱?, 注意, 關的是剛才那個冰箱吧. 也就是說. 開?和關??的是同?個冰箱. 并且. ?象有更換冰箱的權利, 想進那個冰箱就進那個冰箱. 這時, ?象類和冰箱類的關系并沒有那么的緊密. 因為?象可以指定任何?個冰箱. 接下來. 我們把代碼完善?下.

class Elphant:def __init__(self, name):self.name = namedef open(self,obj1):'''開?'''print('大象要開門了,默念三聲,開')obj1.open_door()def close(self):'''關?'''print('大象要關門了,默念三聲,關')class Refrigerator:def open_door(self):print("冰箱?被打開了")def close_door(self):print("冰箱?被關上了")elphant1 = Elphant('大象') haier = Refrigerator() elphant1.open(haier)

  動作發起的主體是大象,你們把關門這個練一下。依賴關系:將一個類的對象或者類名傳到另一個類的方法使用。此時, 我們說, ?象和冰箱之間就是依賴關系. 我?著你. 但是你不屬于我. 這種關系是最弱的.比如. 公司和雇員之間. 對于正式員?, 肯定要簽訂勞動合同. 還得??伺候著. 但是如果是兼職. 那?所謂. 需要了你就來. 不需要你就可以拜拜了. 這?的兼職(臨時?) 就屬于依賴關系.我?你. 但是你不屬于我

2.2 關聯,聚合,組合關系

其實這三個在代碼上寫法是?樣的. 但是, 從含義上是不?樣的.

1. 關聯關系. 兩種事物必須是互相關聯的. 但是在某些特殊情況下是可以更改和更換的.

2. 聚合關系. 屬于關聯關系中的?種特例. 側重點是xxx和xxx聚合成xxx. 各?有各?的聲明周期. 比如電腦. 電腦?有CPU, 硬盤, 內存等等. 電腦掛了. CPU還是好的. 還是完整的個體

3. 組合關系. 屬于關聯關系中的?種特例. 寫法上差不多. 組合關系比聚合還要緊密. 比如?的?腦, ?臟, 各個器官. 這些器官組合成?個?. 這時. ?如果掛了. 其他的東?也跟著掛了

  先看關聯關系:

這個最簡單. 也是最常?的?種關系. 比如. ?家都有男女朋友. 男?關聯著女朋友. 女?關聯著男朋友. 這種關系可以是互相的, 也可以是單??的.

class Boy:def __init__(self,name,girlFriend=None):self.name = nameself.girlFriend = girlFrienddef have_a_diner(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_diner() # 此時是單身狗# 突然有一天,日天牛逼了 b.girlFriend = '如花' b.have_a_diner() #共進晚餐 # wusir 生下來就有女朋友 服不服 gg = Girl('小花') bb = Boy('wusir', gg) bb.have_a_diner()# 結果嫌他有點娘,不硬,分了 bb.girlFriend = None bb.have_a_diner()

注意. 此時Boy和Girl兩個類之間就是關聯關系. 兩個類的對象緊密練習著. 其中?個沒有了. 另?個就孤單的不得了. 關聯關系, 其實就是 我需要你. 你也屬于我. 這就是關聯關系. 像這樣的關系有很多很多. 比如. 學校和老師之間的關系.

# 老師屬于學校,必須有學校才可以工作 class School:def __init__(self,name,address):self.name = nameself.address = addressclass Teacher:def __init__(self,name,school):self.name = nameself.school = schools1 = 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)

但是學校也是依賴于老師的,所以老師學校應該互相依賴。

class School:def __init__(self,name,address):self.name = nameself.address = addressself.teacher_list = []def append_teacher(self,teacher):self.teacher_list.append(teacher)class Teacher:def __init__(self,name,school):self.name = nameself.school = schools1 = School('北京校區','美麗的沙河') s2 = School('上海校區','上海迪士尼旁邊') s3 = School('深圳校區','南山區')t1 = Teacher('武大',s1) t2 = Teacher('海峰',s2) t3 = Teacher('日天',s3)s1.append_teacher(t1) s1.append_teacher(t2) s1.append_teacher(t3)# print(s1.teacher_list) # for teacher in s1.teacher_list: # print(teacher.name)

好了. 這就是關聯關系. 當我們在邏輯上出現了. 我需要你. 你還得屬于我. 這種邏輯 就是關聯關系. 那注意. 這種關系的緊密程度比上?的依賴關系要緊密的多. 為什么呢? 想想吧

至于組合關系和聚合關系,其實代碼上差別不大,咱們就以組合舉例:

組合:將一個類的對象封裝到另一個類的對象的屬性中,就叫組合。

咱們設計一個游戲人物類,讓實例化幾個對象讓這幾個游戲人物實現互毆的效果。

class Gamerole:def __init__(self,name,ad,hp):self.name = nameself.ad = adself.hp = hpdef attack(self,p1):p1.hp -= self.adprint('%s攻擊%s,%s掉了%s血,還剩%s血'%(self.name,p1.name,p1.name,self.ad,p1.hp)) gailun = Gamerole('蓋倫',10,200) yasuo= Gamerole('亞索',50,80)#蓋倫攻擊亞索 gailun.attack(yasuo) # 亞索攻擊蓋倫 yasuo.attack(蓋倫)

但是這樣互相攻擊沒有意思,一般游戲類的的對戰方式要借助武器,武器是一個類,武器類包含的對象很多:刀槍棍劍斧鉞鉤叉等等,所以咱們要寫一個武器類。

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))

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))

接下來借助武器攻擊對方:

pillow = Weapon('繡花枕頭',2) pillow.weapon_attack(barry,panky) # 但是上面這么做不好,利用武器攻擊也是人類是動作的發起者,所以不能是pillow武器對象,而是人類利用武器攻擊對方

所以,對代碼進行修改。

class Gamerole:def __init__(self,name,ad,hp):self.name = nameself.ad = adself.hp = hpdef attack(self,p1):p1.hp -= self.adprint('%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 = nameself.ad = addef weapon_attack(self,p1,p2):p2.hp = p2.hp - self.ad - p1.adprint('%s 利用 %s 攻擊了%s,%s還剩%s血'%(p1.name,self.name,p2.name,p2.name,p2.hp))# 實例化三個人物對象: barry = Gamerole('太白',10,200) panky = Gamerole('金蓮',20,50) pillow = Weapon('繡花枕頭',2)# 給人物裝備武器對象。 barry.equip_weapon(pillow)# 開始攻擊 barry.wea.weapon_attack(barry,panky)

上面就是組合,只要是人物.equip_weapon這個方法,那么人物就封裝了一個武器對象,再利用武器對象調用其類中的weapon_attack方法。

?在python中類的實現關系和類的繼承是一個意思,這個明天再講。

轉載于:https://www.cnblogs.com/jin-xin/articles/10309731.html

總結

以上是生活随笔為你收集整理的02 面向对象之:类空间问题以及类之间的关系的全部內容,希望文章能夠幫你解決所遇到的問題。

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