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