關於python的面向物件
阿新 • • 發佈:2018-11-06
一,面向物件
1..面向物件的過程:一切以事物的流程為核心,核心是過程二字,過程是指解決問題的步驟,
是一種機械是的程式設計思維
優點:負責的問題流程化,編寫相對簡單 缺點:可擴充套件效能差
2.面向物件一切以物件為中心
優點:可擴充套件性強 缺點:程式設計複雜度高於面向過程
面向物件的編寫
class Car: pass c=Car() c.lunzi="圓的" c.red='騷紅色' c.pailiang="6.31" c.pai="粵b無數" c.price="200000" print(c.price) b=Car() b.yanse="綠色" b.year="10年" b.price="100萬" b.paizi="寶馬" b.排量="5.42" print(b.排量)
class Computer: # 構造方法. 在建立的物件的時候由系統自動訪問這個方法 # self: 自己. 自身. 類的物件. 當前正在建立的物件 def __init__(self, pinpai, price, cpu, neicun): # 誰在呼叫, self就是誰, self 由python自動傳遞 self.pinpai = pinpai self.price = price self.cpu = cpu self.neicun = neicun # 方法. 該型別的物件能夠執行哪些操作 def dayouxi(self, game): # 誰呼叫的這個方法. self就是誰 # 我用我的self.pinpai的呼叫. 利用很牛B的self.cpu來完成吃雞操作 print("我要打遊戲, 我要%s" % game) c = Computer("微軟",25000,"i9","5T") # 建立物件 c.dayouxi("吃雞") c2 = Computer("mac book", 22000, "i7", "16G") print(c2.price) c.pinpai = "神州" c.price = 100 c.cpu = "賽揚雙核" c.neicun = "1G" c2 = Computer() c2.pinpai = "小米" c2.price = 10000 c2.cpu = "I7-8750" c2.neicun = "1T" print(c2.pinpai) # 小米 print(c.pinpai) # 神州
思考過程: 準備建立類 -> 定義__init__() self.xxx = xxxx 物件能幹什麼事兒? 方法. def 方法名(self, 引數...) 練習題: 1. 建立⼀個武松. 武松可以打老虎, 殺嫂⼦, 替天⾏道 class HaoHan: def __init__(self, waihao, name, wuqi, jineng): self.waihao = waihao self.name = name self.wuqi = wuqi self.jineng = jineng def dalaohu(self): pass def shasaozi(self): pass def titianxingdao(self): pass ws = HaoHan("行者", "武松", "拳頭", "王八拳") ws.dalaohu() ws.shasaozi() ws.titianxingdao() lk = HaoHan("黑旋風", "李逵", "雙板斧", "旋風斬") lk.dalaohu() lk.shasaozi() lk.titianxingdao() 2. ⽤⾯向物件的思維來模擬LOL⾥的蓋倫(英雄)上陣殺敵. class Tank: def __init__(self, name, waihao, hp, fy): self.name = name self.waihao = waihao self.hp = hp self.fy = fy def kang(self): pass def zhengyishenpan(self): pass gailun = Tank("蓋倫","德瑪西亞之力", 5000, 200) 3. 編寫和尚類. ⾃⼰⾃由發揮和尚有哪些屬性和⽅法. class HeShang: def __init__(self, fahao, simiao): self.fahao = fahao self.simiao = simiao def nianjing(self): pass def marray(self): pass
# 4. ⽤⾯向物件的思維來完成⽤戶登入. class User: def __init__(self, username, password): self.username = username self.password = password def login(self, uname, upws): if uname == self.username and upws == self.password: return True else: return False u1 = User("alex", "123") ret = u1.login(input("請輸入你的使用者名稱"), input("請輸入密碼")) print(ret)
主語發生了改變
函數語言程式設計. 簡單的基本功能還是函數語言程式設計更加好用
面向物件: 如果功能非常複雜的時候.
例一:要把大象裝冰箱:面向物件的過程 def open(): print("開門") def zhuang(): print("裝大象") def close(): print("關門") open() zhuang() close() 例二:面向物件: class DaXiang: def open(self): print("開門") def jinbingxiang(self): print('進冰箱') def guanmen(self): print("關門") dx = DaXiang() dx.open() dx.jinbingxiang() dx.guanmen()
面向物件過程 # alex大戰奧特曼 def daZhanAoTeMan(name, wuqi, jineng): print("%s 使用 %s 配合 %s技能狂懟奧特曼" % (name, wuqi, jineng)) # alex大戰哥斯拉 def daZhanGeSiLa(name, wuqi, jineng): print("%s 使用 %s 配合 %s技能狂懟哥斯拉" % (name, wuqi, jineng)) # alex大戰蝙蝠俠 def daZhanBianFuXia(name, wuqi, jineng): print("%s 使用 %s 配合 %s技能狂懟蝙蝠俠" % (name, wuqi, jineng)) daZhanAoTeMan("alex", "菜刀", "動感光波") daZhanGeSiLa("alex", "菜刀", "動感光波") daZhanBianFuXia("alex", "菜刀", "動感光波") 面向物件:物件做主語執行動作 class Person: def __init__(self, name, wuqi, jineng, taopaoluxian): # 封裝: 對屬性的封裝. self.name = name self.wuqi = wuqi self.jineng = jineng self.taopaoluxian = taopaoluxian # 對方法進行封裝 def daZhanAoTeMan(self): print("%s 使用 %s 配合 %s技能狂懟奧特曼" % (self.name, self.wuqi, self.jineng)) # alex大戰哥斯拉 def daZhanGeSiLa(self): print("%s 使用 %s 配合 %s技能狂懟哥斯拉" % (self.name, self.wuqi, self.jineng)) # alex大戰蝙蝠俠 def daZhanBianFuXia(self): print("%s 使用 %s 配合 %s技能狂懟蝙蝠俠" % (self.name, self.wuqi, self.jineng)) a1 = Person("alex", "菜刀", "動感光波", "打車跑") a1.daZhanAoTeMan() a1.daZhanBianFuXia() a1.daZhanGeSiLa()
繼承: 子類自動擁有父類中除了私有內容外的其他所有的屬性:
例一 class Niu: def da(self): print("牛魔王打架很厲害") class HongHaiEer(Niu): def da(self): print("噴火") hhl = HongHaiEer() hhl.da() 例二
多肽:同一物件擁有多種形態
同一個物件. 擁有多種形態 java c++ class Aniaml: def dong(self): print("動物可以動") class Cat(Aniaml): def chi(self): print("貓喜歡吃魚") a = Cat() a.chi() # 站在貓的角度. 可以吃 a.dong() # 站在動物的角度可以動 # 在python中多型的效果感受不夠明確 class YaoGuai: def teng(self): print("妖怪一定會疼") class ZhiZhuJing(YaoGuai): def teng(self): print("蜘蛛精很痛") class HeiXiongJing(YaoGuai): def teng(self): print("黑熊精也很疼") class BaiGuJing(YaoGuai): def teng(self): print("白骨精骨頭很疼") class JinJiaoDaWang(YaoGuai): def fangundeteng(self): print("爆炸的疼") class SunWuKong: def da(self, yg): yg.teng() # 只要包含了xxx功能的內容都可以試用. 鴨子模型 -> 多型性 # 西遊記開始 swk = SunWuKong() hxj = HeiXiongJing() swk.da(hxj) bgj = BaiGuJing() swk.da(bgj) zzj = ZhiZhuJing() swk.da(zzj) alex = JinJiaoDaWang() swk.da(alex)
多繼承:就近原則:
class Foo1: def money(self): print("有錢") class Foo2: def play(self): print("玩兒") def money(self): print("沒錢") class Bar(Foo2, Foo1): # MRO c3演算法 pass b = Bar() b.money()