摘要:需要注意的是的限定只對當前類的對象生效,對子類并不起任何作用。本文的實例名稱均為杜撰,請不要對號入座我的其他文章已經放到了上,如果感興趣的朋友可以去看看,鏈接如下精品練習題道實用技巧匯總教程
__slots__魔法
大家好,上一期我重點總結了有關類的基本知識,現在簡單回顧一下,順便加上一個創建類時常用的東西:__slots__
首先創建一個名人類: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
可以發現用slots綁定了三個屬性給Celebrity,slots的作用主要有兩個:
如果需要限定自定義類型的對象只能綁定某些屬性,可以通過在類中定義__slots__變量來進行限定。需要注意的是__slots__的限定只對當前類的對象生效,對子類并不起任何作用。
加速
現在可以做個實驗,首先我們把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"
會發現報錯了,即便我們在init方法中有domain屬性,但是由于slots中沒有,所以Celebrity類下創建的實例都不能有domain
接下來讓我們簡單回顧一下如何調用類變量:
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
其實args應該和 kargs一起來說,但是今天先重點看一下它在對象中的應用,我們現在給Celebrity類新建3個實例,并且我們想知道年齡最大的是誰 ?
這種情況下*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.
當然,其他的應用場景還有很多,不多列舉了
類的繼承首先,我們在Celebrity類中新增兩個方法:
description:對生成的大佬簡單描述
speak: 大佬發言
完成后的結果如下:
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)
現在新建兩個類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方法,做個實驗,新建li作為InternetBoss的實例:
li = InternetBoss("Robbin",50,"advertisement")
調用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 ?
可以發現都是一樣的
類的多態, 復寫父類的方法對于類的多態,各種教程說的都太專業了,我的理解僅僅是:
對父類現有方法A,當新增新的子類時,可以根據需要重寫A。
在我們現在的例子中,可以復寫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類生成實例后,會調用自己的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 有兩個判斷繼承的函數:
isinstance() 用于檢查實例類型
issubclass() 用于檢查類繼承
現在還用我們的例子說明一下,首先,這是我們現有的三個類:
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 !")
然后我們分別用不同的類創建三個實例:
mingzhu = Celebrity("Miss Dong",65,"electrical appliance") ma= InternetBoss("Pony", 48,"internet") lei = MobileBoss("leijun", 50,"mobile")
現在使用issubclass()判斷InternetBoss和MobileBoss是否繼承自Celebrity:
# True issubclass(InternetBoss,Celebrity) # True issubclass(MobileBoss,Celebrity)
使用isinstance()查看mingzhu到底是誰的實例:
# True isinstance(mingzhu,Celebrity) # False isinstance(mingzhu,InternetBoss) # False isinstance(mingzhu,MobileBoss)
同理查看ma到底是哪個類的實例:
# True isinstance(ma,Celebrity) # True isinstance(ma,InternetBoss) # False isinstance(ma,MobileBoss)
因為InternetBoss是Celebrity子類,所以ma同時是Celebrity和InternetBoss的實例。
如果我們混用了issubclass和isinstance,會報錯:
issubclass(ma,InternetBoss) Out: TypeError: issubclass() arg 1 must be a class子類重寫構造函數
剛才提到了,如果子類沒有寫構造函數init(),會自動繼承父類的init,但我們通常需要子類有不同的初始函數,這樣我們就需要自己復寫一下,這里以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()會保留需要的父類初始化參數,再添加自己的就行了,這里的repr我會下次總結,現在再新建實例:
總結這次我記錄了slots用法,*args 的一個使用場景,類的繼承,復寫父類方法,構造函數等基本概念,剩下的慢慢來,我會一點點補充。。。
Ps: 本文的實例名稱均為杜撰,請不要對號入座...
我的其他文章已經放到了Github上,如果感興趣的朋友可以去看看,鏈接如下:
Python 精品練習題100道
Python 實用技巧匯總
Python Pandas教程
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/45164.html
摘要:學習廖雪峰官方網站教程總結面向對象編程總結,供日后參考類和實例類的定義限制實例只能添加指定的屬性類屬性初始化值,創建實例必須綁定的屬性變量設置,保證類內部數據安全創建類,實質上是元類,類的定義本質上就是利用創建類先定義函數創建實例報錯,不能 學習廖雪峰官方網站python教程總結python面向對象編程OOP(Object Oriented Programming)總結,供日后參考1....
摘要:時代,如果需要手動繼承,如多態多態是指,不同的子類對象調用相同的父類方法,會產生多態多樣結果的編程特性。 參考:黑馬程序員教程 - Python基礎 面向對象 OOP三大特性,且三個特性是有順序的: 封裝 繼承 多態 封裝 指的就是把現實世界的事務,封裝、抽象成編程里的對象,包括各種屬性和方法。這個一般都很簡單,不需要多講。 唯一要注意的就是:推薦從小往大開始封裝、開發類。比如手槍...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創建了一個具體的對象。對象就是數據,對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 3267·2023-04-25 14:35
閱讀 3417·2021-11-15 18:00
閱讀 2536·2021-11-12 10:34
閱讀 2481·2021-11-11 16:54
閱讀 3464·2021-10-08 10:12
閱讀 2762·2021-09-06 15:02
閱讀 3318·2021-09-04 16:48
閱讀 2799·2019-08-29 14:02