物件導向程式設計程式碼詳解(依賴關係,關聯關係,組合關係)

聽風走了八千里發表於2020-07-01

物件導向程式設計

物件導向程式設計

Oop變程式設計是利用類和物件來建立各種模型來實現對真實世界的描述,使用物件導向程式設計的原因一方面是因為他可以使程式的維護和擴充套件變得更簡單.

Class 類

一個類就是對一類相同屬性的物件、藍圖、原型.簡單來說就是模板

Object 物件

物件就是實體 人狗大戰中的人和狗就是物件    

通過賦值呼叫模板生成的實體,就是例項化

Inheritance繼承 

一個類可以派生出子類,在這個父類裡定義的屬性、方法自動被子類繼承

Encapsulation 封裝

在類中對資料的而賦值、內部呼叫對外部使用者是透明的,這使類變成了一個膠囊或容器,裡面包含著類的資料和方法.

程式導向程式設計

就是程式從上倒下一步步 執行,一步步從上到下,從頭到尾的解決問題

程式導向的例子:有個需求是對網站的日誌進行分析,生成郵件報告,分為以下步驟:

  1. 到各臺伺服器上收集日誌,因為有許多臺網站伺服器,同時對外提供服務
  2. 對日誌進行各種維度的分析,比如:pv,uv,來源地,訪問的裝置等
  3. 生成報告,傳送郵件 

物件導向vs程式導向總結 

程式導向的優點:極大的降低了寫程式的複雜度,只要順著執行的步驟,堆疊德瑪即可

缺點是:一套流水線或者流程就是用來解決一個問題,程式碼前一發動全身

物件導向的優點:解決了程式的擴充套件性,對某一個物件單獨修改,會立刻反映到整個體系中,如對遊戲中的一個任務引數的特徵和技能修改都很容易

缺點:可控性差,無法向程式導向的程式設計流水線式的可以很精準的也測問題的處理流程與結果

 

類的基本語法

class Dog:
    dog_type = "jingba"  #屬性,類屬性,類變數   ,公共屬性,所有狗都相同的屬性
    hp = "100"

    def __init__(self,name,age):   # 初始化方法,構造方法 ,建構函式 例項化時會自自動執行,進行初始化工作
        print('haha',name,age)
        #要想把name,age兩個值,真正的存到例項裡.就需要把兩個值跟例項繫結
        self.name = name
        self.age = age

    def sayhi(self):    #方法,第一個引數必須是self , self代表例項本身
        print("hello ,i  am a dog ,my type is %s"%self.dog_type,self.name,self.age)


d1 = Dog("xdd",2)   # 生成了一個例項
d2 = Dog('jack',3)

d1.sayhi()
d2.sayhi()

print(d1.dog_type)

Self 代表例項本身

屬性引用      類屬性屬於共有屬性  ,例項屬性屬於私有屬性

類的公共屬性引用  ==> 類名.屬性

例項屬性的引用 ==> d.name

 

類之間的依賴關係

# -*- coding:utf-8 -*-
class Dog:

    def __init__(self,name,age,breed,master):
        self.name = name
        self.age = age
        self.breed = breed
        self.master = master
    def depends(self):
        print("hi ,i am %s, i am %s years old,my breed is %s my master is %s"%(self.name,self.age,self.breed,self.master))


class People:

    def __init__(self,name,age):
        self.name = name
        self.age = age
    def lugou(self,dog):
        print("i want liugou %s"%dog.name)

p = People("jack",20)
d = Dog("xdd",2,"jingba",p.name)

d.depends()

物件之間的關聯關係 

# -*- coding:utf-8 -*-
class Relationship:  # 為了儲存couple之間的情侶關係
    def __init__(self):
        self.couple = []

    def make_couple(self, obj1, obj2):
        self.couple = [obj1, obj2]
        print("%s and %s is couple" % (obj1.name, obj2.name))

    def get_my_parter(self, obj):
        # print("find %s de couple"%obj.name)
        for i in self.couple:
            if i != obj:
                return i
        else:
            print("alone dog")
    def break_up(self):
        print("%s and %s break up"%(self.couple[0].name,self.couple[1].name))
        self.couple = []  # 分手

class Person:
    def __init__(self, name, age, sex, relation):
        self.name = name
        self.age = age
        self.sex = sex
        self.relation = relation
        # self.parter = None  # 應該是一個物件

    def do(self):
        pass


make_cp = Relationship()

p1 = Person("xdd", 22, 'Man', make_cp)
p2 = Person("dogs", 23, "Woamn", make_cp)

make_cp.make_couple(p1, p2) #情感狀態

# 雙向關聯,繫結
p1.parter = p2
p2.parter = p1

print(p1.parter.name, p2.parter.name)#  情侶名字 

print(p1.relation.get_my_parter(p1).name)  # p1的物件

p1.relation.break_up()# 分手

p2.relation.get_my_parter(p2)# 情感狀態

物件間的組合關係

# -*- coding:utf-8 -*-
# 組合關係由一堆元件構成一個完整的實體,元件本身獨立,但又不能自己執行,必須跟宿主組合在一起執行
class Dog:

    hp = 100

    def __init__(self,name,breed,attack_val):
        self.name = name
        self.breed = breed
        self.attack_val = attack_val

    def dog_bite(self,person):
        person.hp -= self.attack_val
        print("Dog [%s] bite person [%s] ,person hp - [%s],hp is [%s]"%(self.name,person.name,self.attack_val,person.hp))


class Weapon:  #武器

    def dog_stick(self,obj):
        self.name = "打狗棒"
        self.attackval = 30
        obj.hp -= self.attackval
        self.print_log(obj)

    def print_log(self,obj):
        print("[%s] bei [%s] attack ,- hp [%s],hp is [%s]"%(obj.name,self.name,self.attackval,obj.hp))

class Person:
    hp = 100

    def __init__(self,name,age):
        self.name = name
        self.age = age
        self.weapon = Weapon()
        #self.attack_val = attack_val

    # def person_beat(self,dog):
    #     dog.hp -= self.attack_val
    #     print("People [%s] beat Dog [%s], Dog - hp [%s],Dog hp is [%s]"%(self.name,dog.name,self.attack_val,dog.hp))

d = Dog("dogs","erha",30)
p = Person("xdd",12)
d.dog_bite(p)
p.weapon.dog_stick(d)

  

相關文章