? ? ? ? 類定義? ? ? ?
類 是一個獨立存放變量(屬性/方法)的空間
封裝:
類可以把各種對象組織在一起,作為類的屬性,通過 . (點)運算符來調用類中封裝好的對象
屬性:
變量在類中稱為屬性,但是類中的屬性不僅僅只包含變量,函數等其他的對象也可以作為類的屬性
類的定義:關鍵字class
是一類事物的抽象,不是真是存在的。 描繪了該類事物的共性, 例如:“人類”、“貓類”、“狗類
創建實例:
某類事物的具體個體,是該類事物的具體表現,它是真實存在的。 例如:“炎志”是具體的某個“人” ''墨染''是某個具體的’人’ “加菲貓”是具體的某個“貓” ''湯姆貓'' 是某個具體的’貓‘
實例名 = 類名()
?
一個“實例”的“特征”,就是“屬性”
名字不一樣, 身高不一樣, 年齡不一樣, 大小也不一樣
類屬性和實例屬性
類屬性:在類里面定義的屬性,可以通過類和實例訪問
實例屬性:通過實例定義的屬性,只能通 過實例訪問
類的私有屬性
在python中有兩私有屬性,分別是在屬性前加 一個下換線(_) 和 兩個 下劃線(__)
_x: 意義在于喚起用戶的注意,看成私有屬性,類對象和子類可以訪問
__xx:雙前置下劃線,避免與子類中的屬性命名沖突,無法在外部直接訪問
(名字重整所以訪問不到)
?
私有屬性: 在 Python 中, _ 和 __ 的使用 更多的是一種規范/約定, 沒有真正限制的目的
? ? ? 方法? ? ? ?
類中的方法,就是函數
通常,將默認會傳入的那個參數命名為self,用來表示調用這個方法的實例對象本身。
方法總是定義在類中的,但是卻叫“實例方法”,因為它表示該類所有實例所共有的行為
方法的調用和屬性調用一樣,通過點操作符調用,傳參和函數傳參一樣
class Hero(object):def move(self): #self代表實例本身,那個實例調用就代表那個實例print("%s走向戰場"%self.name) #yanzhi.name #moran.namedef skill(self):print("%s使用了技能:砍一刀"%self.name) #在類中定義的方法叫實例方法不叫類方法yanzhi = Hero() moran = Hero() yanzhi.name = '炎志' moran.name = '墨染' print(yanzhi.name) yanzhi.move() yanzhi.skill() print("=========================================") print(moran.name) moran.move() moran.skill()炎志 炎志走向戰場 炎志使用了技能:砍一刀 ========================================= 墨染 墨染走向戰場 墨染使用了技能:砍一刀
? 初始化和析構?
一、初始化”特殊方法
在Python中有很多以雙下劃線開頭且以雙下劃線結尾的固定方法。
他們會在特定的時機被觸發執行。
__init__ 就是其中之一,它會在實例化之后自動被調用。以完成實例的初始化。
class Hero(object):def __init__(self,name,HP):self.name = nameself.HP = HPdef move(self): #self代表實例本身,那個實例調用就代表那個實例print("%s走向戰場"%self.name) #yanzhi.name #moran.namedef skill(self):print("%s使用了技能:砍一刀"%self.name) #在類中定義的方法叫實例方法不叫類方法 yanzhi = Hero('炎志',3000) moran = Hero('墨染',2500) print(yanzhi.name) print(yanzhi.HP) yanzhi.move() yanzhi.skill() print("=========================================") print(moran.name) print(moran.HP) moran.move() moran.skill()炎志 3000 炎志走向戰場 炎志使用了技能:砍一刀 ========================================= 墨染 2500 墨染走向戰場 墨染使用了技能:砍一刀
二、__init__ 的參數傳遞過程
?
三、基于變量計數的對象銷毀機制
當沒有一個變量指向某個對象的時候,Python會自動銷毀這個對象,以便回收內存空間。
del 關鍵字,可以刪除一個變量的指向。
?__del__”就是一個析構函數了,當使用del 刪除對象時,會調用他本身的析構函數。 提示開發者,對象被銷毀了,方便調試。 進行以寫必要的清理工作。
#代碼運行完自動銷毀 class Hero(object):def __init__(self,name,HP):self.name = nameself.HP = HPdef __del__(self):print(self.name,'被銷毀了')def move(self): #self代表實例本身,那個實例調用就代表那個實例print("%s走向戰場"%self.name) #yanzhi.name #moran.namedef skill(self):print("%s使用了技能:砍一刀"%self.name) #在類中定義的方法叫實例方法不叫類方法 yanzhi = Hero('炎志',3000) moran = Hero('墨染',2500) print(yanzhi.name) print(yanzhi.HP) yanzhi.move() yanzhi.skill() print("=========================================") print(moran.name) print(moran.HP) moran.move() moran.skill()炎志 3000 炎志走向戰場 炎志使用了技能:砍一刀 ========================================= 墨染 2500 墨染走向戰場 墨染使用了技能:砍一刀 墨染 被銷毀了 炎志 被銷毀了
class Hero():def __init__(self,name,HP):self.name = nameself.HP = HPdef __del__(self):print(self.name,'被銷毀了')def move(self):print('%s向前移動兩步'%self.name)def skill(self):print('%s使用了一個技能'%self.name)yanzhi = Hero('炎志',3000) moran = Hero('墨染',3000) yanzhi.move() del yanzhi #主動銷毀 moran.move() moran.skill() 炎志向前移動兩步 炎志 被銷毀了 墨染向前移動兩步 墨染使用了一個技能 墨染 被銷毀了
?