面向對象編程
面向對象編程
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)