摘要:面向?qū)ο箢悓?duì)象實(shí)例類是一個(gè)抽象的存在實(shí)例是真實(shí)存在的類對(duì)象是類的實(shí)例好比說門就是一個(gè)類我的屋門就是門的一個(gè)實(shí)例我的屋門是白顏色的而且打開和關(guān)閉時(shí)會(huì)發(fā)出聲響不管是顏色還是打開和關(guān)閉都是類賦予的屬性和行為至于白顏色和打開和關(guān)閉時(shí)發(fā)出的聲響是這個(gè)
面向?qū)ο驩OP
類(Class)
對(duì)象(Object)
實(shí)例(Instance)
類: 是一個(gè)抽象的存在實(shí)例: 是真實(shí)存在的類
對(duì)象: 是類的實(shí)例
好比說 門 就是一個(gè)類, 我的 屋門 就是門的一個(gè)實(shí)例. 我的屋門是白顏色的, 而且打開和關(guān)閉時(shí)會(huì)發(fā)出聲響.
不管是 顏色, 還是打開和關(guān)閉 都是類賦予的屬性和行為. 至于白顏色和打開和關(guān)閉時(shí)發(fā)出的聲響是這個(gè)實(shí)例的具體表現(xiàn).
對(duì)象: 包括了 類的屬性和行為, 還有實(shí)例所都有的具體表現(xiàn)形式(比如: 白顏色, 打開和關(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): # 重寫父類方法 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" # 這么寫是錯(cuò)誤的, 雖然Python沒有限制 print(pig.__name) # 實(shí)際上就是給 pig 綁了一個(gè)新的屬性 pig.call()
所謂封裝, 就是將類的屬性設(shè)為私有, 然后開放屬性的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í)例, 重新綁定了新的屬性(這樣寫雖然語法沒有錯(cuò), 但不建議這樣寫. 就像某件事, 沒有觸犯法律, 但受到道德的譴責(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也重寫了這個(gè)方法. 有繼承和方法重寫, 自然就有多態(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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/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)你每個(gè)步驟都能做到很優(yōu)秀的時(shí)候,你應(yīng)該考慮如何組合這四個(gè)步驟,使你的爬蟲達(dá)到效率最高,也就是所謂的爬蟲策略問題,爬蟲策略學(xué)習(xí)不是一朝一夕的事情,建議多看看一些比較優(yōu)秀的爬蟲的設(shè)計(jì)方案,比如說。 (一)如何學(xué)習(xí)Python 學(xué)習(xí)Python大致可以分為以下幾個(gè)階段: 1.剛上手的時(shí)候肯定是先過一遍Python最基本的知識(shí),比如說:變量、數(shù)據(jù)結(jié)構(gòu)、語法...
摘要:來自作者鍋蜀黍背景本文主要根據(jù)作者個(gè)月以來對(duì)于人的零基礎(chǔ)教學(xué)經(jīng)驗(yàn)總結(jié)而出,適合零基礎(chǔ)負(fù)基礎(chǔ)學(xué)習(xí)編程語言的同學(xué)閱讀。學(xué)生黨和工作黨的比例是?;A(chǔ)幾乎都沒有。顯然這兩個(gè)人的學(xué)習(xí)方式勢(shì)必是不一樣的。而不是媽的如何又報(bào)錯(cuò)了。 來自 GitChat 作者:鍋蜀黍 背景 本文主要根據(jù)作者2個(gè)月以來對(duì)于 300 人的零基礎(chǔ)python教學(xué)經(jīng)驗(yàn)總結(jié)而出,適合零基礎(chǔ)、負(fù)基礎(chǔ)學(xué)習(xí) python 編程語言...
摘要:勤學(xué)學(xué)習(xí)效率與效果取決于執(zhí)行力。這一步學(xué)習(xí)的正確姿勢(shì)是在實(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); 前段時(shí)間和大家一起分享了一篇關(guān)于學(xué)習(xí)方法內(nèi)容《大牛...
閱讀 1140·2023-04-26 00:12
閱讀 3295·2021-11-17 09:33
閱讀 1075·2021-09-04 16:45
閱讀 1207·2021-09-02 15:40
閱讀 2196·2019-08-30 15:56
閱讀 2976·2019-08-30 15:53
閱讀 3563·2019-08-30 11:23
閱讀 1944·2019-08-29 13:54