物件導向程式設計
物件導向程式設計
Oop變程式設計是利用類和物件來建立各種模型來實現對真實世界的描述,使用物件導向程式設計的原因一方面是因為他可以使程式的維護和擴充套件變得更簡單.
Class 類
一個類就是對一類相同屬性的物件、藍圖、原型.簡單來說就是模板
Object 物件
物件就是實體 人狗大戰中的人和狗就是物件
通過賦值呼叫模板生成的實體,就是例項化
Inheritance繼承
一個類可以派生出子類,在這個父類裡定義的屬性、方法自動被子類繼承
Encapsulation 封裝
在類中對資料的而賦值、內部呼叫對外部使用者是透明的,這使類變成了一個膠囊或容器,裡面包含著類的資料和方法.
程式導向程式設計
就是程式從上倒下一步步 執行,一步步從上到下,從頭到尾的解決問題
程式導向的例子:有個需求是對網站的日誌進行分析,生成郵件報告,分為以下步驟:
- 到各臺伺服器上收集日誌,因為有許多臺網站伺服器,同時對外提供服務
- 對日誌進行各種維度的分析,比如:pv,uv,來源地,訪問的裝置等
- 生成報告,傳送郵件
物件導向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)