摘要:需要注意的是的限定只對當(dāng)前類的對象生效,對子類并不起任何作用。本文的實(shí)例名稱均為杜撰,請不要對號入座我的其他文章已經(jīng)放到了上,如果感興趣的朋友可以去看看,鏈接如下精品練習(xí)題道實(shí)用技巧匯總教程
__slots__魔法
大家好,上一期我重點(diǎn)總結(jié)了有關(guān)類的基本知識,現(xiàn)在簡單回顧一下,順便加上一個創(chuàng)建類時(shí)常用的東西:__slots__
首先創(chuàng)建一個名人類:Celebrity
class Celebrity: # 限定 Celebrity對象只能綁定name, age,domain屬性,加速 __slots__ = ["name","age","domain"] # Class Attribute species = "human" # Initializer / Instance Attributes def __init__(self, name, age, domain): self.name = name self.age = age self.domain = domain
可以發(fā)現(xiàn)用slots綁定了三個屬性給Celebrity,slots的作用主要有兩個:
如果需要限定自定義類型的對象只能綁定某些屬性,可以通過在類中定義__slots__變量來進(jìn)行限定。需要注意的是__slots__的限定只對當(dāng)前類的對象生效,對子類并不起任何作用。
加速
現(xiàn)在可以做個實(shí)驗(yàn),首先我們把slots綁定的domian屬性去掉:
class Celebrity: # Class Attribute species = "human" __slots__ = ["name", "age"] # Initializer / Instance Attributes def __init__(self, name, age,domain): self.name = name self.age = age self.domain = domain female_leader = Celebrity("Miss Dong",65,"electrical appliance") # Access the instance attributes print("{} is {}.".format( female_leader.name, female_leader.age)) Out:AttributeError: "Celebrity" object has no attribute "domain"
會發(fā)現(xiàn)報(bào)錯了,即便我們在init方法中有domain屬性,但是由于slots中沒有,所以Celebrity類下創(chuàng)建的實(shí)例都不能有domain
接下來讓我們簡單回顧一下如何調(diào)用類變量:
female_leader = Celebrity("Miss Dong", 65,"electrical appliance") male_leader = Celebrity("Jack Ma", 55,"internet") # Access the instance attributes print("{} is {} and {} is {}.".format( female_leader.name, female_leader.age, male_leader.name, male_leader.age)) # Is male_leader a human? if male_leader.species == "human": print("{0} is a {1}!".format(male_leader.name, male_leader.species)) Out: Miss Dong is 65 and Jack Ma is 55. Jack Ma is a human!*args
其實(shí)args應(yīng)該和 kargs一起來說,但是今天先重點(diǎn)看一下它在對象中的應(yīng)用,我們現(xiàn)在給Celebrity類新建3個實(shí)例,并且我們想知道年齡最大的是誰 ?
這種情況下*args很好用:
a = Celebrity("Miss Dong",65,"electrical appliance") b = Celebrity("Jack Ma", 55,"internet") c = Celebrity("Lei Jun", 50,"mobile") def get_oldest(*args): return max(args) print("The big brother is {} years old.".format(get_oldest(a.age, b.age, c.age))) Out: The big brother is 65 years old.
當(dāng)然,其他的應(yīng)用場景還有很多,不多列舉了
類的繼承首先,我們在Celebrity類中新增兩個方法:
description:對生成的大佬簡單描述
speak: 大佬發(fā)言
完成后的結(jié)果如下:
class Celebrity: __slots__ = ["name", "age","domain"] species = "human" def __init__(self, name, age, domain): self.name = name self.age = age self.domain = domain # instance method def description(self): return "{} is {} years old, working in the {} industry".format(self.name, self.age,self.domain) # instance method def speak(self, sound): return "{} says {}".format(self.name, sound)
現(xiàn)在新建兩個類InternetBoss,MobileBoss,全部繼承于Celebrity類:
# Child class (inherits from Dog() class) class InternetBoss(Celebrity): pass # Child class (inherits from Dog() class) class MobileBoss(Celebrity): pass
如果我們什么都不做,會自動繼承父類的 description和speak方法,做個實(shí)驗(yàn),新建li作為InternetBoss的實(shí)例:
li = InternetBoss("Robbin",50,"advertisement")
調(diào)用description和speak方法:
li.description() li.speak("What"s your problem ?") Out: Robbin is 50 years old, working in the advertisement industry Robbin says: What"s your problem ?
再嘗試一個MobileBoss的對象:
lei = MobileBoss("leijun", 50,"mobile") lei.speak("Are you ok ?") Out: leijun says: Are you ok ?
可以發(fā)現(xiàn)都是一樣的
類的多態(tài), 復(fù)寫父類的方法對于類的多態(tài),各種教程說的都太專業(yè)了,我的理解僅僅是:
對父類現(xiàn)有方法A,當(dāng)新增新的子類時(shí),可以根據(jù)需要重寫A。
在我們現(xiàn)在的例子中,可以復(fù)寫description方法:
class InternetBoss(Celebrity): def description(self): print("I"m Internet Boss !") class MobileBoss(Celebrity): def description(self): print("I"m Mobile phone Boss !")
這樣InternetBoss類和MobileBoss類生成實(shí)例后,會調(diào)用自己的description方法:
li = InternetBoss("Robbin",50,"advertisement") lei = MobileBoss("leijun", 50,"mobile") li.description() lei.description() Out: I"m Internet Boss ! I"m Mobile phone Boss !isinstance() 和 issubclass()
Python 有兩個判斷繼承的函數(shù):
isinstance() 用于檢查實(shí)例類型
issubclass() 用于檢查類繼承
現(xiàn)在還用我們的例子說明一下,首先,這是我們現(xiàn)有的三個類:
class Celebrity: __slots__ = ["name", "age","domain"] species = "human" def __init__(self, name, age, domain): self.name = name self.age = age self.domain = domain def description(self): print( "{} is {} years old, working in the {} industry".format(self.name, self.age,self.domain)) def speak(self, sound): print("{} says: {}".format(self.name, sound)) class InternetBoss(Celebrity): def description(self): print("I"m Internet Boss !") class MobileBoss(Celebrity): def description(self): print("I"m Mobile phone Boss !")
然后我們分別用不同的類創(chuàng)建三個實(shí)例:
mingzhu = Celebrity("Miss Dong",65,"electrical appliance") ma= InternetBoss("Pony", 48,"internet") lei = MobileBoss("leijun", 50,"mobile")
現(xiàn)在使用issubclass()判斷InternetBoss和MobileBoss是否繼承自Celebrity:
# True issubclass(InternetBoss,Celebrity) # True issubclass(MobileBoss,Celebrity)
使用isinstance()查看mingzhu到底是誰的實(shí)例:
# True isinstance(mingzhu,Celebrity) # False isinstance(mingzhu,InternetBoss) # False isinstance(mingzhu,MobileBoss)
同理查看ma到底是哪個類的實(shí)例:
# True isinstance(ma,Celebrity) # True isinstance(ma,InternetBoss) # False isinstance(ma,MobileBoss)
因?yàn)镮nternetBoss是Celebrity子類,所以ma同時(shí)是Celebrity和InternetBoss的實(shí)例。
如果我們混用了issubclass和isinstance,會報(bào)錯:
issubclass(ma,InternetBoss) Out: TypeError: issubclass() arg 1 must be a class子類重寫構(gòu)造函數(shù)
剛才提到了,如果子類沒有寫構(gòu)造函數(shù)init(),會自動繼承父類的init,但我們通常需要子類有不同的初始函數(shù),這樣我們就需要自己復(fù)寫一下,這里以InternetBoss為例:
class InternetBoss(Celebrity): def __init__(self,name, age, domain,hometown): super().__init__(name, age, domain) self.hometown = hometown def description(self): print("I"m Internet Boss !") def __repr__(self): return f"This is {self.name} speaking !"
使用了super()會保留需要的父類初始化參數(shù),再添加自己的就行了,這里的repr我會下次總結(jié),現(xiàn)在再新建實(shí)例:
總結(jié)這次我記錄了slots用法,*args 的一個使用場景,類的繼承,復(fù)寫父類方法,構(gòu)造函數(shù)等基本概念,剩下的慢慢來,我會一點(diǎn)點(diǎn)補(bǔ)充。。。
Ps: 本文的實(shí)例名稱均為杜撰,請不要對號入座...
我的其他文章已經(jīng)放到了Github上,如果感興趣的朋友可以去看看,鏈接如下:
Python 精品練習(xí)題100道
Python 實(shí)用技巧匯總
Python Pandas教程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/45164.html
摘要:學(xué)習(xí)廖雪峰官方網(wǎng)站教程總結(jié)面向?qū)ο缶幊炭偨Y(jié),供日后參考類和實(shí)例類的定義限制實(shí)例只能添加指定的屬性類屬性初始化值,創(chuàng)建實(shí)例必須綁定的屬性變量設(shè)置,保證類內(nèi)部數(shù)據(jù)安全創(chuàng)建類,實(shí)質(zhì)上是元類,類的定義本質(zhì)上就是利用創(chuàng)建類先定義函數(shù)創(chuàng)建實(shí)例報(bào)錯,不能 學(xué)習(xí)廖雪峰官方網(wǎng)站python教程總結(jié)python面向?qū)ο缶幊蘋OP(Object Oriented Programming)總結(jié),供日后參考1....
摘要:時(shí)代,如果需要手動繼承,如多態(tài)多態(tài)是指,不同的子類對象調(diào)用相同的父類方法,會產(chǎn)生多態(tài)多樣結(jié)果的編程特性。 參考:黑馬程序員教程 - Python基礎(chǔ) 面向?qū)ο?OOP三大特性,且三個特性是有順序的: 封裝 繼承 多態(tài) 封裝 指的就是把現(xiàn)實(shí)世界的事務(wù),封裝、抽象成編程里的對象,包括各種屬性和方法。這個一般都很簡單,不需要多講。 唯一要注意的就是:推薦從小往大開始封裝、開發(fā)類。比如手槍...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍(lán)圖或原型。在中,對象通過對類的實(shí)體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實(shí)例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 3312·2023-04-25 14:35
閱讀 3426·2021-11-15 18:00
閱讀 2583·2021-11-12 10:34
閱讀 2504·2021-11-11 16:54
閱讀 3488·2021-10-08 10:12
閱讀 2770·2021-09-06 15:02
閱讀 3329·2021-09-04 16:48
閱讀 2806·2019-08-29 14:02