Python面向對象編程代碼詳解(依賴關系,關聯關系,組合關系)


面向對象編程

面向對象編程

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)

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM