在了解類(lèi)和實(shí)例之前,需要先了解什么是面向?qū)ο螅裁从质敲嫦蜻^(guò)程。面向過(guò)程是以過(guò)程為中心實(shí)現(xiàn)一步步操作(相互調(diào)用,類(lèi)似流水線思想);面向?qū)ο笫且允挛餅橹行模硞€(gè)事物可以擁有自己的多個(gè)行為,而另一個(gè)事物也可以擁有自己的多個(gè)行為。
面向?qū)ο蟮幕A(chǔ):
對(duì)象:沒(méi)有具體的事物,只能說(shuō)是一切皆對(duì)象。如人、汽車(chē)、國(guó)家,.......
對(duì)象的屬性和行為:這個(gè)對(duì)象有什么特征或者有什么行為方式。如人有身高、頭發(fā)顏色等屬性,人有睡覺(jué)、吃飯等行為
類(lèi):將具有相同特征的屬性和行為的對(duì)象抽象出來(lái)封裝成一個(gè)可以描述多個(gè)對(duì)象的類(lèi)。所以就有類(lèi)是對(duì)象的抽象,對(duì)象是類(lèi)的實(shí)例
消息和方法:對(duì)象之間的通信傳遞簡(jiǎn)稱(chēng)消息,而方法是實(shí)現(xiàn)傳遞消息的可觀效果
繼承:某個(gè)對(duì)象是由另一個(gè)對(duì)象產(chǎn)生的,也可以抽象為某個(gè)類(lèi)是由另一個(gè)類(lèi)產(chǎn)生的,這個(gè)對(duì)象就可以擁有另個(gè)對(duì)象的所有屬性和行為
多態(tài):多個(gè)對(duì)象的相同行為會(huì)產(chǎn)生不一樣的結(jié)果
面向?qū)ο蟮奶匦裕?
由上述我們可以總結(jié)出抽象、封裝、繼承、多態(tài)4大特性
本篇博客主要內(nèi)容就是簡(jiǎn)單的講述這4大特性和面向?qū)ο蟮幕A(chǔ)知識(shí),在講述的過(guò)程中會(huì)擴(kuò)展一些知識(shí)
抽象
類(lèi)是軟件開(kāi)發(fā)過(guò)程中對(duì)業(yè)務(wù)相關(guān)的具有共同特征的事物的抽象。所以類(lèi)在編程語(yǔ)言中是抽象的主要表現(xiàn)形式
我們可以對(duì)“人”進(jìn)行抽象并抽象成Person類(lèi),因?yàn)槿祟?lèi)有一些共同的特征,我們也可以對(duì)“動(dòng)物”進(jìn)行抽象并抽象成Animal類(lèi)。
# Person類(lèi) class Person: """ 人的共有特征和行為 """ def __init__ (self, high, weight): self.high = high self.weight = weight # 說(shuō)話 def speak(self): pass # 睡覺(jué) def sleep(self): pass
代碼博主只寫(xiě)了一丟丟Person共有的屬性和行為,有過(guò)編程經(jīng)驗(yàn)的朋友們都知道一些初始化方法,這里是初始化一些共有的屬性;還定義一些共有的方法;
在接下來(lái)講的應(yīng)該都是封裝需要講述的
封裝
對(duì)于封裝,類(lèi)可以封裝我們上述所說(shuō)的具有共同屬性和行為的一種方式(大的封裝)。而封裝又不限于類(lèi),函數(shù)也是可以封裝一些共同的操作。下面涉及的知識(shí)都是封裝,只是封裝的方式會(huì)略有不同,我們先不談封裝知識(shí)。
我們先對(duì)初始化方法進(jìn)行一個(gè)簡(jiǎn)單的了解,python類(lèi)里__init__()方法是對(duì)對(duì)象的初始化一些屬性的方法,但是這個(gè)方法不是創(chuàng)建對(duì)象。我們?cè)趧?chuàng)建類(lèi)時(shí),這個(gè)__init__()方法就是我們需要放置一些我們考慮多個(gè)對(duì)象的共同的屬性還有一些需要初始化的操作(調(diào)用方法),既然__init__()方法不是創(chuàng)建對(duì)象的方法,那么創(chuàng)建對(duì)象的方法是哪個(gè)呢?__new__()方法。相信朋友們已經(jīng)見(jiàn)過(guò)了這個(gè)方法,這個(gè)方法在創(chuàng)建類(lèi)時(shí)會(huì)自動(dòng)調(diào)用,不需要我們寫(xiě)出來(lái)(待會(huì)寫(xiě)出來(lái)用于測(cè)試)。這樣明了,創(chuàng)建對(duì)象的時(shí)候先調(diào)用__new__()方法返回一個(gè)對(duì)象,然后再調(diào)用__init__()方法初始化對(duì)象的屬性。
class Person: def __new__ (cls, *args, ** kwargs): # 父類(lèi)調(diào)用__new__()返回一個(gè)對(duì)象 return super(). __new__ (cls) def __init__ (self, high, weight): self.high = high self.weight = weight person = Person(12, 135)
在類(lèi)中可以有很多屬性,我這說(shuō)的很多不是屬性的個(gè)數(shù),也不是屬性值的類(lèi)型,而是屬性的類(lèi)型。以下代碼里的注釋可以忽略
屬性的類(lèi)型有:類(lèi)屬性、類(lèi)的私有屬性、類(lèi)的保護(hù)屬性,實(shí)例屬性、實(shí)例的私有屬性、實(shí)例的保護(hù)屬性,這里說(shuō)的保護(hù)屬性和私有屬性,在python中沒(méi)有嚴(yán)格說(shuō)明,但是功能或者使用保留
1、類(lèi)屬性:
類(lèi)和實(shí)例都可以直接修改并且訪問(wèn)類(lèi)屬性
在實(shí)例方法通過(guò)實(shí)例訪問(wèn)和修改類(lèi)屬性
在類(lèi)方法通過(guò)類(lèi)名訪問(wèn)和修改類(lèi)屬性
在靜態(tài)方法通過(guò)類(lèi)名訪問(wèn)和修改類(lèi)的私屬性
如果實(shí)例有與類(lèi)屬性同名的實(shí)例屬性,那么修改和訪問(wèn)就和類(lèi)屬性沒(méi)有關(guān)系了

class Person: # 類(lèi)的保護(hù)屬性初始值“12” count = " 12 " def __init__ (self, high, weight): self.high = high self.weight = weight def self_set_count(self, count): self.count = count def self_get_count(self): return self.count # 類(lèi)方法 @classmethod def class_set_count(cls, count): cls.count = count @classmethod def class_get_count(cls): return cls.count # 靜態(tài)方法 @staticmethod def static_set_count(count): Person.count = count @staticmethod def static_get_count(): return Person.count person = Person(12, 135 ) # 實(shí)例直接修改并訪問(wèn)類(lèi)的保護(hù)屬性 person.count = " 24 " print (person.count) # 類(lèi)名直接修改并訪問(wèn)類(lèi)的保護(hù)屬性 Person.count = " 36 " print (Person.count) # 實(shí)例調(diào)用實(shí)例方法修改并訪問(wèn)類(lèi)的私有屬性 person.self_set_count( " 24 " ) print (person.self_get_count()) # 24 # 類(lèi)名調(diào)用類(lèi)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.class_set_count( " 36 " ) print (Person.class_get_count()) # 36 # 實(shí)例調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 person.static_set_count( " 24 " ) print (person.static_get_count()) # 24 # 類(lèi)名調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.static_set_count( " 36 " ) print (Person.static_get_count()) # 36
2、類(lèi)的私有屬性:
在實(shí)例方法通過(guò)實(shí)例訪問(wèn)和修改類(lèi)的私有屬性
在類(lèi)方法通過(guò)類(lèi)名訪問(wèn)和修改類(lèi)的私有屬性
在靜態(tài)方法通過(guò)類(lèi)名訪問(wèn)和修改類(lèi)的私有屬性
在類(lèi)外類(lèi)和實(shí)例都是不能訪問(wèn)的;如果實(shí)例有與類(lèi)的私有屬性同名的實(shí)例私有屬性,那么修改和訪問(wèn)就和類(lèi)的私有屬性沒(méi)有關(guān)系了

class Person: # 類(lèi)屬性初始值12 count = 12 # 類(lèi)的私有屬性初始值“12” __string = " 12 " def __new__ (cls, *args, ** kwargs): return super(). __new__ (cls) def __init__ (self, high, weight): self.high = high self.weight = weight def self_set_string(self, string): self. __string = string def self_get_string(self): return self. __string # 類(lèi)方法 @classmethod def class_set_string(cls, string): cls. __string = string @classmethod def class_get_string(cls): return cls. __string # 靜態(tài)方法 @staticmethod def static_set_string(string): Person. __string = string @staticmethod def static_get_string(): return Person. __string person = Person(12, 135 ) # 實(shí)例修改并訪問(wèn)類(lèi)屬性 person.count = 24 print (person.count) # 24 # 類(lèi)名修改并訪問(wèn)類(lèi)屬性 Person.count = 36 print (Person.count) # 36 # 實(shí)例調(diào)用實(shí)例方法修改并訪問(wèn)類(lèi)的私有屬性 person.self_set_string( " 24 " ) print (person.self_get_string()) # 24 # 類(lèi)名調(diào)用類(lèi)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.class_set_string( " 36 " ) print (Person.class_get_string()) # 36 # 實(shí)例調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 person.static_set_string( " 24 " ) print (person.static_get_string()) # 24 # 類(lèi)名調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.static_set_string( " 36 " ) print (Person.static_get_string()) # 36
3、類(lèi)的保護(hù)屬性:
在類(lèi)外通過(guò)類(lèi)和實(shí)例訪問(wèn)和修改類(lèi)的保護(hù)屬性
在實(shí)例方法通過(guò)實(shí)例訪問(wèn)和修改類(lèi)的保護(hù)屬性
在類(lèi)方法通過(guò)類(lèi)名訪問(wèn)和修改類(lèi)的保護(hù)屬性
在靜態(tài)方法通過(guò)類(lèi)名訪問(wèn)和修改類(lèi)的保護(hù)屬性
在模塊外類(lèi)和實(shí)例都是不能訪問(wèn)的;如果實(shí)例有與類(lèi)的保護(hù)屬性同名的實(shí)例保護(hù)屬性,那么修改和訪問(wèn)就和類(lèi)的保護(hù)屬性沒(méi)有關(guān)系了

class Person: # 類(lèi)的保護(hù)屬性初始值“12” _protection = " 12 " def __init__ (self, high, weight): self.high = high self.weight = weight def self_set_protection(self, protection): self._protection = protection def self_get_protection(self): return self._protection # 類(lèi)方法 @classmethod def class_set_protection(cls, protection): cls._protection = protection @classmethod def class_get_protection(cls): return cls._protection # 靜態(tài)方法 @staticmethod def static_set_protection(protection): Person._protection = protection @staticmethod def static_get_protection(): return Person._protection person = Person(12, 135 ) # 實(shí)例直接修改并訪問(wèn)類(lèi)的保護(hù)屬性 person._protection = " 24 " print (person._protection) # 類(lèi)名直接修改并訪問(wèn)類(lèi)的保護(hù)屬性 Person._protection = " 36 " print (Person._protection) # 實(shí)例調(diào)用實(shí)例方法修改并訪問(wèn)類(lèi)的私有屬性 person.self_set_protection( " 24 " ) print (person.self_get_protection()) # 24 # 類(lèi)名調(diào)用類(lèi)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.class_set_protection( " 36 " ) print (Person.class_get_protection()) # 36 # 實(shí)例調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 person.static_set_protection( " 24 " ) print (person.static_get_protection()) # 24 # 類(lèi)名調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.static_set_protection( " 36 " ) print (Person.static_get_protection()) # 36
4、實(shí)例屬性:
在類(lèi)外通過(guò)類(lèi)和實(shí)例訪問(wèn)和修改實(shí)例屬性
在實(shí)例方法通過(guò)實(shí)例訪問(wèn)和修改實(shí)例屬性
在類(lèi)方法通過(guò)類(lèi)名訪問(wèn)和修改實(shí)例屬性
在靜態(tài)方法通過(guò)類(lèi)名訪問(wèn)和修改實(shí)例屬性
如果實(shí)例有與類(lèi)屬性同名的實(shí)例屬性,那么修改和訪問(wèn)就和類(lèi)屬性沒(méi)有關(guān)系了

class Person: def __init__ (self, high, weight): # 實(shí)例屬性 self.high = high self.weight = weight def self_set_high(self, high): self.high = high def self_get_high(self): return self.high # 類(lèi)方法 @classmethod def class_set_high(cls, high): cls.high = high @classmethod def class_get_high(cls): return cls.high # 靜態(tài)方法 @staticmethod def static_set_high(high): Person.high = high @staticmethod def static_get_high(): return Person.high person = Person(12, 135 ) # 實(shí)例直接修改并訪問(wèn)類(lèi)的保護(hù)屬性 person.high = " 24 " print (person.high) # 類(lèi)名直接修改并訪問(wèn)類(lèi)的保護(hù)屬性 Person.high = " 36 " print (Person.high) # 實(shí)例調(diào)用實(shí)例方法修改并訪問(wèn)類(lèi)的私有屬性 person.self_set_high( " 24 " ) print (person.self_get_high()) # 24 # 類(lèi)名調(diào)用類(lèi)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.class_set_high( " 36 " ) print (Person.class_get_high()) # 36 # 實(shí)例調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 person.static_set_high( " 24 " ) print (person.static_get_high()) # 24 # 類(lèi)名調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.static_set_high( " 36 " ) print (Person.static_get_high()) # 36
5、實(shí)例的私有屬性:
在實(shí)例方法通過(guò)實(shí)例訪問(wèn)和修改實(shí)例私有屬性
在類(lèi)方法通過(guò)類(lèi)名訪問(wèn)和修改實(shí)例私有屬性
在靜態(tài)方法通過(guò)類(lèi)名訪問(wèn)和修改實(shí)例私有屬性
在類(lèi)外通過(guò)類(lèi)和實(shí)例訪問(wèn)和修改實(shí)例私有屬性,相當(dāng)于自身動(dòng)態(tài)增加了一個(gè)屬性,所以在類(lèi)外是不能訪問(wèn)的;如果實(shí)例有與類(lèi)的私有屬性同名的實(shí)例私有屬性,那么修改和訪問(wèn)就和類(lèi)的私有屬性沒(méi)有關(guān)系了

class Person: def __init__ (self, high, weight): # 實(shí)例屬性 self.high = high self. __weight = weight def self_set_weight(self, weight): self. __weight = weight def self_get_weight(self): return self. __weight # 類(lèi)方法 @classmethod def class_set_weight(cls, weight): cls. __weight = weight @classmethod def class_get_weight(cls): return cls. __weight # 靜態(tài)方法 @staticmethod def static_set_weight(weight): Person. __weight = weight @staticmethod def static_get_weight(): return Person. __weight person = Person(12, 135 ) # 這里是實(shí)例動(dòng)態(tài)增加的屬性 person. __weight = " 24 " print (person. __weight ) # 這里是類(lèi)名動(dòng)態(tài)增加的屬性 Person. __weight = " 36 " print (Person. __weight ) # 實(shí)例調(diào)用實(shí)例方法修改并訪問(wèn)類(lèi)的私有屬性 person.self_set_weight( " 24 " ) print (person.self_get_weight()) # 24 # 類(lèi)名調(diào)用類(lèi)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.class_set_weight( " 36 " ) print (Person.class_get_weight()) # 36 # 實(shí)例調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 person.static_set_weight( " 24 " ) print (person.static_get_weight()) # 24 # 類(lèi)名調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.static_set_weight( " 36 " ) print (Person.static_get_weight()) # 36
6、實(shí)例的保護(hù)屬性:
在實(shí)例方法通過(guò)實(shí)例訪問(wèn)和修改實(shí)例保護(hù)屬性
在類(lèi)方法通過(guò)類(lèi)名訪問(wèn)和修改實(shí)例保護(hù)屬性
在靜態(tài)方法通過(guò)類(lèi)名訪問(wèn)和修改實(shí)例保護(hù)屬性
在類(lèi)外通過(guò)類(lèi)和實(shí)例訪問(wèn)和修改實(shí)例保護(hù)屬性,相當(dāng)于自身動(dòng)態(tài)增加了一個(gè)屬性,所以在類(lèi)外是不能訪問(wèn)的;如果實(shí)例有與類(lèi)的私有屬性同名的實(shí)例私有屬性,那么修改和訪問(wèn)就和類(lèi)的私有屬性沒(méi)有關(guān)系了

class Person: def __init__ (self, high, weight): # 實(shí)例屬性 self.high = high # 實(shí)例保護(hù)屬性 self._weight = weight def self_set_weight(self, weight): self._weight = weight def self_get_weight(self): return self._weight # 類(lèi)方法 @classmethod def class_set_weight(cls, weight): cls._weight = weight @classmethod def class_get_weight(cls): return cls._weight # 靜態(tài)方法 @staticmethod def static_set_weight(weight): Person._weight = weight @staticmethod def static_get_weight(): return Person._weight person = Person(12, 135 ) # 這里是實(shí)例動(dòng)態(tài)增加的屬性 person._weight = " 24 " print (person._weight) # 這里是類(lèi)名動(dòng)態(tài)增加的屬性 Person._weight = " 36 " print (Person._weight) # 實(shí)例調(diào)用實(shí)例方法修改并訪問(wèn)類(lèi)的私有屬性 person.self_set_weight( " 24 " ) print (person.self_get_weight()) # 24 # 類(lèi)名調(diào)用類(lèi)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.class_set_weight( " 36 " ) print (Person.class_get_weight()) # 36 # 實(shí)例調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 person.static_set_weight( " 24 " ) print (person.static_get_weight()) # 24 # 類(lèi)名調(diào)用靜態(tài)方法修改并訪問(wèn)類(lèi)的私有屬性 Person.static_set_weight( " 36 " ) print (Person.static_get_weight()) # 36
? 關(guān)于類(lèi)里面涉及屬性都舉例說(shuō)明了(親測(cè)有效),但是類(lèi)中出現(xiàn)了幾種方法,這個(gè)方法也是關(guān)鍵。類(lèi)的方法類(lèi)型:類(lèi)方法、實(shí)例方法、靜態(tài)方法
主要是驗(yàn)證誰(shuí)可以調(diào)用3大方法
上述代碼已經(jīng)驗(yàn)證了實(shí)例可以調(diào)用實(shí)例方法、類(lèi)名可以調(diào)用類(lèi)方法、類(lèi)名可以調(diào)用靜態(tài)方法
實(shí)例可以調(diào)用類(lèi)方法和靜態(tài)方法
類(lèi)名可以調(diào)用實(shí)例方法,傳參必須傳遞一個(gè)具體實(shí)例

class Person: def __init__ (self, high, weight): # 實(shí)例屬性 self.high = high # 實(shí)例保護(hù)屬性 self._weight = weight def self_set_weight(self, weight): self._weight = weight def self_get_weight(self): return self._weight # 類(lèi)方法 @classmethod def class_set_weight(cls, weight): cls._weight = weight @classmethod def class_get_weight(cls): return cls._weight # 靜態(tài)方法 @staticmethod def static_set_weight(weight): Person._weight = weight @staticmethod def static_get_weight(): return Person._weight person = Person(12, 135 ) # 實(shí)例調(diào)用類(lèi)方法 person.class_set_weight( " 24 " ) print (person.class_get_weight()) # 24 # 實(shí)例調(diào)用靜態(tài)方法 person.static_set_weight( " 36 " ) print (person.static_get_weight()) # 36 # 類(lèi)名調(diào)用實(shí)例方法,第一個(gè)參數(shù)必須是具體的實(shí)例 Person.self_set_weight(person, " 24 " ) print (Person.self_get_weight(person)) # 24
? 總結(jié):
1、對(duì)象名可以調(diào)用靜態(tài)方法、實(shí)例方法、類(lèi)方法
2、類(lèi)名可以調(diào)用靜態(tài)方法、類(lèi)方法、實(shí)例方法,但在調(diào)用實(shí)例方法時(shí)需要將第一個(gè)參數(shù)self傳入,傳入的其實(shí)是對(duì)象本身,不帶參數(shù)報(bào)錯(cuò)
3、實(shí)例屬性通過(guò)實(shí)例方法的
4、類(lèi)屬性通過(guò)類(lèi)方法的
繼承
當(dāng)子類(lèi)/子對(duì)象和父類(lèi)/父對(duì)象有很多共同之處,但是又有不同之處,這個(gè)時(shí)候我們就可以使用繼承機(jī)制。繼承父類(lèi)的屬性和行為,其他屬性和行為需自己定義。
python用的最多的繼承是單繼承,當(dāng)然python也提供多繼承的,但是盡可能的不要使用多繼承,如果多繼承多了的話,編程的思維很容易亂。
類(lèi)繼承需在類(lèi)名添加括號(hào),在括號(hào)里添加父類(lèi)名稱(chēng),這還沒(méi)有實(shí)現(xiàn)繼承。使用super關(guān)鍵字調(diào)用父類(lèi)的方法,屬性可以直接拿來(lái)使用。父類(lèi)可以看作是對(duì)子類(lèi)的共同屬性和方法的抽象,將他們封裝成我們需要的父類(lèi)
類(lèi)繼承的幾個(gè)關(guān)鍵點(diǎn):
1、子類(lèi)繼承可以繼承父類(lèi)的初始化函數(shù)__init__(),但是子類(lèi)不寫(xiě)初始化函數(shù)時(shí),會(huì)自動(dòng)/默認(rèn)調(diào)用父類(lèi)的初始化函數(shù);子類(lèi)定義初始化函數(shù),也一定要調(diào)用父類(lèi)初始化函數(shù)
這里繼承是只能繼承父類(lèi)的類(lèi)屬性,不能繼承父類(lèi)對(duì)象的屬性,若想也擁有同樣的屬性,所以才繼承父類(lèi)的初始化函數(shù)。
抱歉!改天更新...
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
