摘要:面向?qū)ο箢悓ο髮?shí)例類是一個抽象的存在實(shí)例是真實(shí)存在的類對象是類的實(shí)例好比說門就是一個類我的屋門就是門的一個實(shí)例我的屋門是白顏色的而且打開和關(guān)閉時會發(fā)出聲響不管是顏色還是打開和關(guān)閉都是類賦予的屬性和行為至于白顏色和打開和關(guān)閉時發(fā)出的聲響是這個
面向?qū)ο驩OP
類(Class)
對象(Object)
實(shí)例(Instance)
類: 是一個抽象的存在實(shí)例: 是真實(shí)存在的類
對象: 是類的實(shí)例
好比說 門 就是一個類, 我的 屋門 就是門的一個實(shí)例. 我的屋門是白顏色的, 而且打開和關(guān)閉時會發(fā)出聲響.
不管是 顏色, 還是打開和關(guān)閉 都是類賦予的屬性和行為. 至于白顏色和打開和關(guān)閉時發(fā)出的聲響是這個實(shí)例的具體表現(xiàn).
對象: 包括了 類的屬性和行為, 還有實(shí)例所都有的具體表現(xiàn)形式(比如: 白顏色, 打開和關(guān)閉時發(fā)出聲響)
在面向?qū)ο蟮某绦蛟O(shè)計(jì)中, 首先要抽離出實(shí)體, 以及這個實(shí)體所擁有的屬性和行為(方法).
面向?qū)ο蟮娜筇攸c(diǎn): 封裝, 繼承, 多態(tài)
封裝class Animal(object): def __init__(self, args): super(Animal, self).__init__() self.__name = args.get("name") self.age = args.get("age") def call(self): print("Animal(name:{0}, age:{1}) Call....".format(self.__name, self.age)); def setAnimalInfo(self, *, name, age): self.__name = name self.age = age def getAnimalInfo(self): return {"name": self.__name, "age": self.age} def __str__(self): # 重寫父類方法 return "Animal(name:{0}, age:{1})".format(self.__name, self.age) pig = Animal({}) pig.setAnimalInfo(name="tom", age=2) pig.call() pig.age = 3 print(pig.age) print(pig._Animal__name) # 不建議這樣訪問 # print(pig.__name) # AttributeError: "Animal" object has no attribute "__name" pig.__name = "jack" # 這么寫是錯誤的, 雖然Python沒有限制 print(pig.__name) # 實(shí)際上就是給 pig 綁了一個新的屬性 pig.call()
所謂封裝, 就是將類的屬性設(shè)為私有, 然后開放屬性的get, set方法. 這樣會提高程序的健壯性(比如set時, 驗(yàn)證實(shí)參是否合法)
因?yàn)?strong>構(gòu)造方法(__init__(self, args))中, 存在必選參數(shù), 所以在初始化實(shí)例時 pig = Animal({})
實(shí)際上私有屬性, 在實(shí)例化對象時, 就已經(jīng)改了變量名, 所以才有的 AttributeError: "Animal" object has no attribute "__name" 的錯誤信息
pig.__name = "jack" 就像當(dāng)于給pig實(shí)例, 重新綁定了新的屬性(這樣寫雖然語法沒有錯, 但不建議這樣寫. 就像某件事, 沒有觸犯法律, 但受到道德的譴責(zé).)
繼承class Animal(object) Animal 繼承自 object,
class Dog(Animal): def __init__(self, args): super(Dog, self).__init__(args) def call(self): # print("Dog(name:{0}, age:{1}) wang....".format(super().__name, super.age)); print("Dog(name:{0}, age:{1}) wang....".format(super(Dog, self).getAnimalInfo().get("name"), super(Dog, self).getAnimalInfo().get("age"))); def __str__(self): # 重寫父類方法 # return "Dog(name:{0}, age:{1})".format(super().__name, super.age) return "Dog(name:{0}, age:{1})".format(super(Dog, self).getAnimalInfo().get("name"), super(Dog, self).getAnimalInfo().get("age")) class Cat(Animal): def __init__(self, args): super(Cat, self).__init__(args) def call(self): # print("Cat(name:{0}, age:{1}) miao....".format(self.__name, self.age)); print("Cat(name:{0}, age:{1}) miao....".format(super(Cat, self).getAnimalInfo().get("name"), super(Cat, self).getAnimalInfo().get("age"))); def __str__(self): # 重寫父類方法 # return "Cat(name:{0}, age:{1})".format(self.__name, self.age) return "Cat(name:{0}, age:{1})".format(super(Cat, self).getAnimalInfo().get("name"), super(Cat, self).getAnimalInfo().get("age")) dog = Dog({"name": "lucy", "age": 2}) cat = Cat({"name":"lola", "age":1}) dog.call() cat.call() print("pig is Animal", isinstance(pig, Animal)) print("dog is Dog", isinstance(dog, Dog)) print("cat is Cat", isinstance(cat, Cat)) print("dog is Animal", isinstance(dog, Animal)) print("cat is Animal", isinstance(cat, Animal))
在子類中, 獲取父類的引用 super(Dog, self). 而在子類中要想拿到父類的屬性, 只能通過父類中提供的開放接口, 來實(shí)現(xiàn)了.
多態(tài)從上面的程序中可以看出, Animal重寫了他的父類的__str__方法, Cat和Dog也重寫了這個方法. 有繼承和方法重寫, 自然就有多態(tài)了.
def getAnimal(animal): print(animal) getAnimal(pig) getAnimal(dog) getAnimal(cat) # Animal(name:tom, age:3) # Dog(name:lucy, age:2) # Cat(name:lola, age:1)
雖傳入的都是 Animal類, 但執(zhí)行的卻有著不同的行為. 這就是多態(tài)(^_^)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41267.html
摘要:楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),。本文來源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲軟件定制開發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲學(xué)習(xí)系列教程(來源于某博主:htt...
摘要:以下這些項(xiàng)目,你拿來學(xué)習(xí)學(xué)習(xí)練練手。當(dāng)你每個步驟都能做到很優(yōu)秀的時候,你應(yīng)該考慮如何組合這四個步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個階段: 1.剛上手的時候肯定是先過一遍Python最基本的知識,比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:來自作者鍋蜀黍背景本文主要根據(jù)作者個月以來對于人的零基礎(chǔ)教學(xué)經(jīng)驗(yàn)總結(jié)而出,適合零基礎(chǔ)負(fù)基礎(chǔ)學(xué)習(xí)編程語言的同學(xué)閱讀。學(xué)生黨和工作黨的比例是。基礎(chǔ)幾乎都沒有。顯然這兩個人的學(xué)習(xí)方式勢必是不一樣的。而不是媽的如何又報(bào)錯了。 來自 GitChat 作者:鍋蜀黍 背景 本文主要根據(jù)作者2個月以來對于 300 人的零基礎(chǔ)python教學(xué)經(jīng)驗(yàn)總結(jié)而出,適合零基礎(chǔ)、負(fù)基礎(chǔ)學(xué)習(xí) python 編程語言...
摘要:勤學(xué)學(xué)習(xí)效率與效果取決于執(zhí)行力。這一步學(xué)習(xí)的正確姿勢是在實(shí)踐操作中發(fā)掘問題,然后帶著問題找答案。拆分任務(wù)將目標(biāo)分解成具體可執(zhí)行的學(xué)習(xí)任務(wù)。勤學(xué)強(qiáng)大的執(zhí)行力是學(xué)習(xí)的根本保障。分享復(fù)述檢驗(yàn)學(xué)習(xí)成果,提高學(xué)習(xí)效果的最好方法。 showImg(https://segmentfault.com/img/bVbcPGZ?w=256&h=256); 前段時間和大家一起分享了一篇關(guān)于學(xué)習(xí)方法內(nèi)容《大牛...
閱讀 1135·2023-04-26 00:12
閱讀 3276·2021-11-17 09:33
閱讀 1069·2021-09-04 16:45
閱讀 1196·2021-09-02 15:40
閱讀 2181·2019-08-30 15:56
閱讀 2970·2019-08-30 15:53
閱讀 3557·2019-08-30 11:23
閱讀 1939·2019-08-29 13:54