1. 程式人生 > >python--類與類之間的關係

python--類與類之間的關係

1.依賴關係

類與類之間存在這幾種關係:1.依賴關係 2.關聯關係 3.組合關係 4.聚合關係 5.繼承關係 6.實現關係

 我們來設定下面兩個場景 玩電腦和打殭屍

class Person:
    def play(self, tools): # 通過引數的傳遞把另外一個類的物件傳遞進來
        tools.run()
        print("很開心, 我能玩兒遊戲了")


class Computer:
    def run(self):
        print("電腦開機. 可以執行")

class Phone:
    def run(self):
        print("手機開機, 可以執行")


c = Computer()
phone = Phone()

p = Person()
p.play(phone)



# 寫一個植物大戰殭屍
# 1. 植物
#       打殭屍. 殭屍掉血
# 2. 殭屍
#       吃植物. 植物掉血

class Plant:
    def __init__(self, name, hp, ad): # 200
        self.name = name
        self.hp = hp
        self.ad = ad

    def attack(self, js):
        print("植物攻擊殭屍")
        js.hp -= self.ad
        print(f"殭屍掉血{self.ad}, 還剩下{js.hp}")

class JiangShi:
    def __init__(self, name, hp, ad): # 1000  800
        self.name = name
        self.hp = hp
        self.ad = ad

    def attack(self, zw):
        print("殭屍咬植物")
        zw.hp -= self.ad
        print(f"植物掉血{self.ad}, 還剩{zw.hp}")


# 植物
wd = Plant("歪脖子豌豆", 10, 20)
# 殭屍
js = JiangShi("鐵桶殭屍", 200, 1)
wd.attack(js)
wd.attack(js)
wd.attack(js)
wd.attack(js)
wd.attack(js)

js.attack(wd)
js.attack(wd)
js.attack(wd)
js.attack(wd)

  

 

 

2.關聯關係,組合關係,聚合關係

這三個在程式碼上寫法是一樣的,但是,從含義上是不一樣的

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

2.聚合關係.屬於關聯關係中的一種特例.側重點是xxx和xxx聚合成xxx.各自有各自的宣告週期.比如電腦,電腦有cpu,硬碟,記憶體等等.電腦壞了,cpu還是好的,還是完整的個體.

3.組合關係.屬於關聯關係中的一中特例.寫法上差不多.組合關係比聚合還要緊密,比如人的大腦,心臟,各個器官,這個器官組合成一個人.這是人如果掛了.其他的東西也就失效了

我們舉個例子,男人關聯著女朋友,女人關聯著男朋友.這種關係可以是互相的

class Boy:

    def __init__(self, name,  girlFriend=None):
        # 在初始化的時候可以給一個物件的屬性設定成另一個類的物件
        self.girlFriend = girlFriend  # 一個男孩有一個女朋友

    def chi(self):
        if self.girlFriend:
            print(f"帶著他的女朋友{self.girlFriend.name}去吃飯")
        else:
            print("單身狗, 吃什麼吃? 滾去學習.")

    def movie(self):
        if self.girlFriend:
            print(f"帶著他的女朋友{self.girlFriend.name}去看電影")
        else:
            print("單身狗, 看什麼看? 滾去學習.")


class Girl:
    def __init__(self, name):
        self.name = name

b = Boy("小明")
g = Girl("小紅")
b.chi()

# 給小名介紹一個女朋友 小紅
b.girlFriend = g
b.chi()

g2 = Girl("小紅")
b.girlFriend = g2 # 換了個女朋友
b.chi()


class School:

    def __init__(self, name):
        self.teach_list = [] # 這裡要裝多個老師
        self.name = name

    def zhaopin(self, teach):
        self.teach_list.append(teach)

    def shangke(self):
        for t in self.teach_list:
            t.work()

class Teacher:
    def __init__(self, name):
        self.name = name
    def work(self):
        print(f"{self.name}在上課")

lnh = School("小學")
t1 = Teacher("王老師")
t2 = Teacher("趙老師")
t3 = Teacher("錢老師")
t4 = Teacher("孫老師")
t5 = Teacher("李老師")
t6 = Teacher("周老師")

lnh.zhaopin(t1)
lnh.zhaopin(t2)
lnh.zhaopin(t3)
lnh.zhaopin(t4)
lnh.zhaopin(t5)
lnh.zhaopin(t6)

lnh.shangke()

1.一對一關係 只有一個女朋友  2.一對多關係  一個學校,一堆老師

 

 

 

3.繼承關係,self

self:誰呼叫的就是誰.型別是根據呼叫方的物件來進行變換的,self在訪問方法的順序,永遠先找自己的.自己找不到再找父類的

super:表示的是父類

 

 

 

4.類中的特殊成員

 

__init__ :      建構函式,在生成物件時呼叫,類名()會自動執行
__del__ :       解構函式,釋放物件時使用
__repr__ :      列印,轉換
__setitem__ :   按照索引賦值
__getitem__:    按照索引獲取值
__len__:        獲得長度
__cmp__:        比較運算
__call__:       呼叫
__add__:        加運算
__sub__:        減運算
__mul__:        乘運算
__div__:        除運算
__mod__:        求餘運算
__pow__:        冪
__call__          物件()會自動執行
__getitem__   物件[key]會自動執行
__setitem__    [key]=value會自動執行
__delitem__         del物件[key]會自動執行
__enter__  和__exit__      with物件as變數會自動執行
__str__            列印物件的時候會自動執行 
__hash__  == None 物件就不可雜湊了

 

  

 

__init__()就是一個特殊的成員.這些方法在特殊的場景的時候會被自動執行

類名()會自動執行__init__()
def __init__(self): # 初始化操作
       print("我是init,  我是老二")
       print("初始化操作. 在建立物件的時候自動呼叫這個方法")

 def __new__(cls, *args, **kwargs): # 建立, 它是真正的構造方法, 可以開闢記憶體
     print("我是new. 我是老大")
          return object.__new__(cls)

 
物件()會自動執行__call__()
def __call__(self, *args, **kwargs):
        print("我是物件()")
物件[key]會自動執行__getitem__()
 # 物件[]
 def __getitem__(self, item):
      print("item=",item)
      print("你執行了__getitem__")
      return "哈哈"
del 物件[key]會自動執行__delitem__()
del lst[1]
     def __delitem__(self, key):
          print("key=", key)
with物件as變數 會自動執行__enter__和__exit__
# with 物件:
def __enter__(self):
   print("我是enter")

# with 物件: 程式碼執行完畢. 最後執行這裡
def __exit__(self, exc_type, exc_val, exc_tb):
   print("我叫exit")
列印物件的時候會自動執行__str__
class Student:
    def __init__(self, name, no, gender, cls, age):
        self.name = name
        self.no = no
        self.gender = gender
        self.cls = cls
        self.age = age


    # 這個物件字串的表示.
    def __str__(self): # 返回該物件的字串表示形式
        return f"{self.name}, {self.no}, {self.gender}"

    def __repr__(self): # 該物件的官方的字串表示形式
        return f"{self.name}, {self.no}, {self.gender}"


s = Student("小名", "3", "男", "三年二班", "31")
print(s)
幹掉可雜湊__hash__ == None 物件就不可雜湊了

面向物件程式設計的執行流程 ->
1. 載入類 -> 給類建立一個名稱空間 -> 主要存放類變數.
2. 建立物件 -> 先找類. -> 根據類來開闢記憶體 -> 執行類中的__new__() -> 執行__init__() -> 返回物件