做網(wǎng)站要學多久電商運營
文章目錄
- 前言
- 一、類定義語法
- 二、私有方法和私有屬性
- 1.私有屬性
- 2.私有方法
- 三、類“繼承”
- 1.初識繼承
- 2.使用super函數(shù)調(diào)用父類中構造的東西
- 四、類“多態(tài)”
- 1.多態(tài)基礎
- 2.子類不同形態(tài)
- 3.使用isinstance函數(shù)與多態(tài)結合判斷類型
- 總結
前言
大家好,我是BoBo仔吖,上3節(jié)課我們學習了類的基礎知識。這節(jié)課,我們要講一些深入的東西。
是什么呢?看看就知道!
一、類定義語法
其實,我們學習的class類都可以看做我們定義的功能語法
之前我講解type函數(shù)的時候也說到了我們的牢大class
這是我們的文章
https://blog.csdn.net/m0_69481332/article/details/138410028?spm=1001.2014.3001.5501
這里有一個內(nèi)容要注意:
這幅圖片我給大家扣過來了,大家會發(fā)現(xiàn):這里我們通過type函數(shù)判斷類型后(其實,list等等也是一個類哦),下面的輸出是<class'類型'>
大家是不是也看看讓自己的類的語法形式?使用type方法即可!
還是有栗子:
這是我們上次的例子
我們都知道,我們把類GameB賦予了變量game_begin
所以,我們用type來檢驗它的時候便反映了它的類語法形式,也就是GameB
這里還有一個main
<class '__main__.GameB'>
這里出現(xiàn)了__main__方法,因為這是我們自己定義的類語法空間
這就是類定義語法,非常簡單似不似?
接下來,我們學習一些更加深入的內(nèi)容
二、私有方法和私有屬性
1.私有屬性
我們還是把我們之前的例子拿出來
class GameB:def __init__(self,exp,grade):self.exp = expself.grade = gradedef print_message(self):print('經(jīng)驗值',self.exp)print('等級',self.grade)game_begin = GameB('0',1)
game_begin.print_message()
print(type(game_begin))
這里我們把class GameB的設定叫做定義類,而其中的函數(shù)則稱為方法
為什么要扯概念?因為這個東東非常重要
接下來,我們來講一個和上文一點不搭噶的東西
class Dog:def __init__(self,name):self.__name = nameself.__age = Noneprint(self.__name,'生成成功!')def set_age(self,age):if not isinstance(age,int):#這里的函數(shù)isinstance是判斷它括號內(nèi)的兩個參數(shù)中,參數(shù)1是否是參數(shù)2的類型,如果不是就執(zhí)行下面的操作,通常作為條件使用print('輸入的年齡必須是數(shù)字!')return Falseif age <= 0:print('年齡必須大于0!')return Falseself.__age = agedef play(self):print('汪汪汪!我今年',self.__age)dog =Dog('旺財')
dog.set_age('hello!')
dog.set_age(-20)
dog.set_age(3)
dog.play()
這是一個生成dog角色的函數(shù),這里我們發(fā)現(xiàn)有一個非常眼生的東西:私有屬性
私有屬性的屬性呢和他的本身命名的特性差不多,是一個“私有”屬性
大家可以把私有屬性看做一件事情:
我們在家里可能穿睡衣,穿拖鞋;但是,我們在外面就不會穿的這么奇怪
我們就可以把家里看做class類里,外面看做class類外的代碼,這樣大家是不是就理解多了呢?
這里的結構是__(下劃線×2)對象名
這個私有屬性呢與我們普通的屬性有一個顯著的特點就是他不能直接改動,而是需要在某個特定的函數(shù)中再次修改,且不能再類以外的地方調(diào)用
例如這里,我們構造了兩個私有屬性,它們是__age
和__name
屬性age只能通過類中的set_age修改,不能再外部直接改動,否則會發(fā)生錯誤
就像這樣:
當然,有私有屬性就有私有方法
2.私有方法
這里的方法概念上面提到了,就是我們所封裝的函數(shù)
私有方法的理解也可以向上文那樣:你在家里休息日時可能9點起,12點睡,打游戲,吃KFC;但是,你上學或是工作時就必須早起,調(diào)整作息。
我們還是把家看做類代碼,把外面看做類以外的代碼
我們還是以類Dog為例,構造私有方法__say(self,name)
代碼如下:
class Dog:def __say(self,name):print(name)def play(self):print('汪汪汪!')dog = Dog()
dog.play()
這里我們的私有方法沒有起任何作用
而且,這里不能通過類以外區(qū)域來修改這個函數(shù),否則會出現(xiàn)錯誤
大家學會私有概念了嗎?如果學會,那么你的類使用就更加靈活咯!!!
三、類“繼承”
繼承呢我們往往會聯(lián)想到一些時間:老父親的特征往往會繼承給兒女,這就是生理繼承(DNA繼承)
這種廣義上的繼承想必大家都知道,那么,在類里,繼承是什么一種概念呢?
還是甩出剛剛的示例,就是那個生成doggy的模型
這里我們看源代碼,看看有什么相同和不同
1.初識繼承
class Animal:def __init__(self,name):self.name = name def play(self):print('我是',self.name)class Dog(Animal):#注意看,這就是繼承的格式!!pass#這里我們沒有私有方法,所以這里我們在下面調(diào)用的時候調(diào)整就可以了dog = Dog('旺財')#這里繼承了Animal類中的方法,賦給dog之后,就可以轉而通過Dog類調(diào)用Animal的內(nèi)容
dog.play()
這里我們的繼承類采用的是這樣的格式:
class 類名【子類】(主類名【或者叫父類】):
我們通過繼承的手法可以更加靈活地使用父類里的東西,而且還能修改(私有屬性或私有方法除外,不可繼承),更加靈活。這里我們的父類Animal受了Dog的調(diào)用,如果我們在dog里修改animal類,那么效果會更加良好
2.使用super函數(shù)調(diào)用父類中構造的東西
class Animal:def __init__(self,name):self.name = namedef play(self):print('我是',self.name)class Dog(Animal):def __init__(self):print('旺財')dog = Dog()
在這個例子里,我們在dog類中繼承了Animal,但是由于沒有調(diào)用play,所以只能輸出旺財
但是,我們?nèi)绻苯邮褂梅椒╬lay,那么就會出錯,因為我們使用的是類Dog里的構造方法,而不是類Animal的構造方法,盡管我們繼承了Animal類
如果我們要實現(xiàn)animal類的構造方法,那么我們就要用到super() 內(nèi)置函數(shù)
就像這樣:
class Animal:def __init__(self, name):self.name = namedef play(self):print('我是', self.name)class Dog(Animal):def __init__(self):super(Dog,self).__init__('旺財')dog = Dog()
dog.play()
我們使用super函數(shù)來調(diào)用我們在Animal類中所繼承的__init__構造方法,完之后就可以直接使用play來運行Animal類中的內(nèi)容了
怎么樣,是不是很神奇?
四、類“多態(tài)”
多態(tài)是基于繼承上的一種形式,我們可以把它大致理解為“父類的多個子類”
還是以類Animal為例,來看看使用多態(tài)后結果如何
1.多態(tài)基礎
還是這個例子
class Animal:def say(self):print('Animal')class Dog(Animal):passclass Cat(Animal):passdog = Dog()
dog.say()cat = Cat()
cat.say()
這里我們用兩個形式來繼承Animal,它們分別是類Dog和類Cat
我們的兩個子類繼承父類Animal之后,使用了父類中的方法say,這個大家應該能理解
接下來,我們來看點深層的內(nèi)容
2.子類不同形態(tài)
這里我們的目標是使用2個不同的子類來通過共同繼承父類Animal來輸出不同的內(nèi)容
其實也不難,只要在類Dog與Cat中分別加入自己的內(nèi)容即可
具體代碼如下:
class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
dog.say()cat = Cat()
cat.say()
這里我們的輸出就是Dog與Cat了,我們共同使用了自己所繼承的方法來創(chuàng)造自己不同的結果,這就是多態(tài)的體現(xiàn)
3.使用isinstance函數(shù)與多態(tài)結合判斷類型
這個isinstance函數(shù)呢大家不陌生,之前的一個章節(jié)中我就用它判斷過類型:對,就是實戰(zhàn)的那一章,我用這個來判斷輸入類型(構造旺財?shù)哪且徽n,大家可以翻翻我之前的文章找一找)
具體格式我就不說了,大家可以自己根據(jù)我使用的方法自己練練手
接下來我們直接上代碼
我們的isinstance函數(shù)和我們的多態(tài)是有關系的,所以我把他放在這里節(jié)里講解
首先,我們像剛剛那樣使用dog變量與cat變量分別迭代類Dog與類Cat
class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
cat = Cat()
好,不要眨眼,接下來就是重頭戲!
我們這里其實也能把cat與dog變量看做一種調(diào)用繼承的形式。根據(jù)這個邏輯,我們可以用isinstance來判斷繼承的正誤,簡稱來說就是看是不是親生的
OK,我們先上代碼
class Animal:def say(self):print('Animal')class Dog(Animal):def say(self):print('Dog')class Cat(Animal):def say(self):print('Cat')dog = Dog()
cat = Cat()print(isinstance(dog,Dog))
print(isinstance(dog,Animal))
print(isinstance(cat,Cat))
print(isinstance(cat,Animal))
這里我們的輸出是:
True
True
True
True
好,現(xiàn)在我們知道了,dog和cat都是自己的祖宗親生的了
接下來,我們就要好好琢磨琢磨
首先,我們把后面幾行單獨剔出來檢查
dog = Dog()
cat = Cat()print(isinstance(dog,Dog))
print(isinstance(dog,Animal))
print(isinstance(cat,Cat))
print(isinstance(cat,Animal))
我們這里使用dog和cat兩個變量“繼承”了類Dog,Cat與Animal
所以,我們的這里的輸出是正確的
我之前講過,其實我們的數(shù)據(jù)類型,像int,float,str,list等等,其實都是一個類,我們只要使用isinstance函數(shù)就能看出,逗號“,”前的是不是逗號“,”后的類型。所以,大家現(xiàn)在懂數(shù)據(jù)類型與類的關聯(lián)性原理了吧
總結
好了,今天的內(nèi)容到此結束。實在是寫不動了,下次再努力吧
下節(jié)課,我們將學習類的最后一講:拓展篇,大家敬請期待!如有不懂,別忘了問我喲!下期見~~~
【制作不易,別忘了一圈三連,點個關注!!!】