面向物件編程
面向物件編程
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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/103799.html
標籤:Python
上一篇:112買賣股票的最佳時機II
下一篇:linux環境"ModuleNotFoundError: No module named 'Cryptodome'"
