在了解類和實例之前,需要先了解什么是面向對象,什么又是面向過程。面向過程是以過程為中心實現一步步操作(相互調用,類似流水線思想);面向對象是以事物為中心,某個事物可以擁有自己的多個行為,而另一個事物也可以擁有自己的多個行為。
面向對象的基礎:
對象:沒有具體的事物,只能說是一切皆對象。如人、汽車、國家,.......
對象的屬性和行為:這個對象有什么特征或者有什么行為方式。如人有身高、頭發顏色等屬性,人有睡覺、吃飯等行為
類:將具有相同特征的屬性和行為的對象抽象出來封裝成一個可以描述多個對象的類。所以就有類是對象的抽象,對象是類的實例
消息和方法:對象之間的通信傳遞簡稱消息,而方法是實現傳遞消息的可觀效果
繼承:某個對象是由另一個對象產生的,也可以抽象為某個類是由另一個類產生的,這個對象就可以擁有另個對象的所有屬性和行為
多態:多個對象的相同行為會產生不一樣的結果
面向對象的特性:
由上述我們可以總結出抽象、封裝、繼承、多態4大特性
本篇博客主要內容就是簡單的講述這4大特性和面向對象的基礎知識,在講述的過程中會擴展一些知識
抽象
類是軟件開發過程中對業務相關的具有共同特征的事物的抽象。所以類在編程語言中是抽象的主要表現形式
我們可以對“人”進行抽象并抽象成Person類,因為人類有一些共同的特征,我們也可以對“動物”進行抽象并抽象成Animal類。
# Person類 class Person: """ 人的共有特征和行為 """ def __init__ (self, high, weight): self.high = high self.weight = weight # 說話 def speak(self): pass # 睡覺 def sleep(self): pass
代碼博主只寫了一丟丟Person共有的屬性和行為,有過編程經驗的朋友們都知道一些初始化方法,這里是初始化一些共有的屬性;還定義一些共有的方法;
在接下來講的應該都是封裝需要講述的
封裝
對于封裝,類可以封裝我們上述所說的具有共同屬性和行為的一種方式(大的封裝)。而封裝又不限于類,函數也是可以封裝一些共同的操作。下面涉及的知識都是封裝,只是封裝的方式會略有不同,我們先不談封裝知識。
我們先對初始化方法進行一個簡單的了解,python類里__init__()方法是對對象的初始化一些屬性的方法,但是這個方法不是創建對象。我們在創建類時,這個__init__()方法就是我們需要放置一些我們考慮多個對象的共同的屬性還有一些需要初始化的操作(調用方法),既然__init__()方法不是創建對象的方法,那么創建對象的方法是哪個呢?__new__()方法。相信朋友們已經見過了這個方法,這個方法在創建類時會自動調用,不需要我們寫出來(待會寫出來用于測試)。這樣明了,創建對象的時候先調用__new__()方法返回一個對象,然后再調用__init__()方法初始化對象的屬性。
class Person: def __new__ (cls, *args, ** kwargs): # 父類調用__new__()返回一個對象 return super(). __new__ (cls) def __init__ (self, high, weight): self.high = high self.weight = weight person = Person(12, 135)
在類中可以有很多屬性,我這說的很多不是屬性的個數,也不是屬性值的類型,而是屬性的類型。以下代碼里的注釋可以忽略
屬性的類型有:類屬性、類的私有屬性、類的保護屬性,實例屬性、實例的私有屬性、實例的保護屬性,這里說的保護屬性和私有屬性,在python中沒有嚴格說明,但是功能或者使用保留
1、類屬性:
類和實例都可以直接修改并且訪問類屬性
在實例方法通過實例訪問和修改類屬性
在類方法通過類名訪問和修改類屬性
在靜態方法通過類名訪問和修改類的私屬性
如果實例有與類屬性同名的實例屬性,那么修改和訪問就和類屬性沒有關系了

class Person: # 類的保護屬性初始值“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 # 類方法 @classmethod def class_set_count(cls, count): cls.count = count @classmethod def class_get_count(cls): return cls.count # 靜態方法 @staticmethod def static_set_count(count): Person.count = count @staticmethod def static_get_count(): return Person.count person = Person(12, 135 ) # 實例直接修改并訪問類的保護屬性 person.count = " 24 " print (person.count) # 類名直接修改并訪問類的保護屬性 Person.count = " 36 " print (Person.count) # 實例調用實例方法修改并訪問類的私有屬性 person.self_set_count( " 24 " ) print (person.self_get_count()) # 24 # 類名調用類方法修改并訪問類的私有屬性 Person.class_set_count( " 36 " ) print (Person.class_get_count()) # 36 # 實例調用靜態方法修改并訪問類的私有屬性 person.static_set_count( " 24 " ) print (person.static_get_count()) # 24 # 類名調用靜態方法修改并訪問類的私有屬性 Person.static_set_count( " 36 " ) print (Person.static_get_count()) # 36
2、類的私有屬性:
在實例方法通過實例訪問和修改類的私有屬性
在類方法通過類名訪問和修改類的私有屬性
在靜態方法通過類名訪問和修改類的私有屬性
在類外類和實例都是不能訪問的;如果實例有與類的私有屬性同名的實例私有屬性,那么修改和訪問就和類的私有屬性沒有關系了

class Person: # 類屬性初始值12 count = 12 # 類的私有屬性初始值“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 # 類方法 @classmethod def class_set_string(cls, string): cls. __string = string @classmethod def class_get_string(cls): return cls. __string # 靜態方法 @staticmethod def static_set_string(string): Person. __string = string @staticmethod def static_get_string(): return Person. __string person = Person(12, 135 ) # 實例修改并訪問類屬性 person.count = 24 print (person.count) # 24 # 類名修改并訪問類屬性 Person.count = 36 print (Person.count) # 36 # 實例調用實例方法修改并訪問類的私有屬性 person.self_set_string( " 24 " ) print (person.self_get_string()) # 24 # 類名調用類方法修改并訪問類的私有屬性 Person.class_set_string( " 36 " ) print (Person.class_get_string()) # 36 # 實例調用靜態方法修改并訪問類的私有屬性 person.static_set_string( " 24 " ) print (person.static_get_string()) # 24 # 類名調用靜態方法修改并訪問類的私有屬性 Person.static_set_string( " 36 " ) print (Person.static_get_string()) # 36
3、類的保護屬性:
在類外通過類和實例訪問和修改類的保護屬性
在實例方法通過實例訪問和修改類的保護屬性
在類方法通過類名訪問和修改類的保護屬性
在靜態方法通過類名訪問和修改類的保護屬性
在模塊外類和實例都是不能訪問的;如果實例有與類的保護屬性同名的實例保護屬性,那么修改和訪問就和類的保護屬性沒有關系了

class Person: # 類的保護屬性初始值“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 # 類方法 @classmethod def class_set_protection(cls, protection): cls._protection = protection @classmethod def class_get_protection(cls): return cls._protection # 靜態方法 @staticmethod def static_set_protection(protection): Person._protection = protection @staticmethod def static_get_protection(): return Person._protection person = Person(12, 135 ) # 實例直接修改并訪問類的保護屬性 person._protection = " 24 " print (person._protection) # 類名直接修改并訪問類的保護屬性 Person._protection = " 36 " print (Person._protection) # 實例調用實例方法修改并訪問類的私有屬性 person.self_set_protection( " 24 " ) print (person.self_get_protection()) # 24 # 類名調用類方法修改并訪問類的私有屬性 Person.class_set_protection( " 36 " ) print (Person.class_get_protection()) # 36 # 實例調用靜態方法修改并訪問類的私有屬性 person.static_set_protection( " 24 " ) print (person.static_get_protection()) # 24 # 類名調用靜態方法修改并訪問類的私有屬性 Person.static_set_protection( " 36 " ) print (Person.static_get_protection()) # 36
4、實例屬性:
在類外通過類和實例訪問和修改實例屬性
在實例方法通過實例訪問和修改實例屬性
在類方法通過類名訪問和修改實例屬性
在靜態方法通過類名訪問和修改實例屬性
如果實例有與類屬性同名的實例屬性,那么修改和訪問就和類屬性沒有關系了

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

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

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

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

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