python是一門解釋語音,可是它是面向對象的,能夠進行對象編程。在進行python面向對象編程以前,先來了解幾個術語:類、類對象、實例對象、屬性、函數和方法。python
1、如何定義一個類?c++
class people(object): #新式類 block class people: #經典類 block
類後面有個冒號,在block塊裏面能夠定義屬性和方法。當一個類定義完就產生了一個類對象。類對象支持兩種操做:實例化和引用。引用操做就是經過類對象去調用類中的函數和方法,而實例化則是產生一個類對象的實例,稱做實例對象:編程
class human(object): #定義一個新式類human sex = 'male' #定義一個屬性 def func(self): #定義一個方法 print(self.sex)
human類定義完成後就產生了一個全局的類對象,能夠經過類對象訪問類中的屬性和方法。當經過human.sex來訪問時,human.sex中的human就稱爲類對象。也能夠進行實例化操做,h=human(),這樣就產生了一個human的實例對象,此時也能夠經過對象H來訪問屬性和方法h.sex函數
瞭解了類、類對象和實例對象的區別後,咱們繼續瞭解python中的函數、方法和屬性的區別。spa
在上面的代碼中註釋中,咱們知道sex是一個屬性,func()是一個方法,與某個對象進行綁定的函數叫作方法。在類中定義的函數與類對象或者實例對象綁定了,因此稱做方法。而類外定義的函數通常沒有進行綁定,就稱做函數。code
2、屬性對象
在類中,咱們能夠定義一些屬性,好比:blog
class animal(object): name = 'dog' age = 2 a = animal() print(a.name,a.age)
定義一個animal類,裏面定義了name和age屬性。在定義類以後,就能夠來產生實例化對象,a = animal()就產生了一個實例化對象a,這裏name和age都是公有屬性,能夠在類外直接經過對象名訪問,若是想定義成私有的,就在屬性前面加上兩個下劃線'__'內存
class animal(object): __name = 'dog' __age = 2 a = animal() print(a.__name,a.__age)
這段程序會報錯資源
Traceback (most recent call last): File "C:/Users/PycharmProjects/untitled1/file.py", line 8, in <module> print(a.__name, a.__age) AttributeError: 'animal' object has no attribute '__name'
提示找不到該屬性,由於私有屬性是不可以在類外經過對象名進行訪問的,在python裏面沒有public和private關鍵字來區別公有屬性和私有屬性,它是以屬性命名方式來區分的,若是在屬性名前面加2個下劃線'__',則代表該屬性爲私有屬性,不然爲公有屬性(方法同屬性同樣,也是前面加2個下劃線'__')
3、方法
在類中能夠根據須要定義一些方法,定義方法採用def關鍵字,在類中定義的方法至少會有一個參數,通常以名爲'self'的變量做爲該參數,並且做爲第一個參數。下面來看個例子:
class human(object): __name = 'Jack' __age = 24 def getname(self): return self.__name def getage(self): return self.__age m = human() print(m.getname()) print(m.getage())
4、類中內置的方法
在Python中有一些內置的方法,這些方法命名都有比較特殊的地方(其方法名以2個下劃線開始而後以2個下劃線結束)。類中最經常使用的就是構造方法和析構方法。
構造方法__init__(self,....)在生成對象時調用,能夠用來進行一些初始化操做,不須要顯示去調用,系統會默認去執行。構造方法支持重載,若是用戶本身沒有從新定義構造方法,系統就自動執行默認的構造方法。
析構方法__del__(self)在釋放對象時調用,支持重載,能夠在裏面進行一些釋放資源的操做,不須要顯示調用。
五.類屬性、實例屬性、類方法、實例方法以及靜態方法
瞭解一些基本概念後,咱們來學學python中這幾個概念的區別。
在前面的例子中,咱們接觸到的就是類屬性,顧名思義,就是類對象所擁有的屬性,它被全部類對象的實例對象所共有,在內存中只存一個副本,這個和c++中類的靜態成員變量有些相似。對於公有的類屬性,能夠經過類對象和實例對象調訪問。
class people(object): name = 'TOM' #公有類屬性 __age = 18 #私有類屬性 p = people() print(p.name) print((people.name)) print(p.__age) print(people.__age)
實例屬性是不須要在類中顯示定義的。
class animal(object): name = 'cat' a = animal() a.sex = 'male' print(a.name) #正確 print(a.sex) #正確 print(animal.name) #正確 print(animal.sex) #錯誤
在類外對類對象people進行實例化以後,產生了一個實例對象p,而後p.age = 12這句給p添加了一個實例屬性age,賦值爲12。這個實例屬性是實例對象p所特有的,注意,類對象people並不擁有它(因此不能經過類對象來訪問這個age屬性)。固然還能夠在實例化對象的時候給age賦值。
class people(object): name = 'jack' #__init__()是內置的構造方法,在實例化對象時自動調用 def __init__(self,age): self.age = age p = people(12) print (p.name) #正確 print (p.age) #正確 print (people.name) #正確 print (people.age) #錯誤
若是須要在類外修改類屬性,必須經過類對象去引用而後進行修改。若是經過實例對象去引用,會產生一個同名的實例屬性,這種方式修改的是實例屬性,不會影響到類屬性,而且以後若是經過實例對象去引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性,除非刪除了該實例屬性。
class people(object): country = 'china' print (people.country) p = people() print (p.country) p.country = 'japan' print (p.country) #實例屬性會屏蔽掉同名的類屬性 print (people.country) del p.country #刪除實例屬性 print (p.country)
運行結果:
china
china
japan
china
china
下面來看下類方法、實例方法和靜態方法的區別。
類方法:類對象所擁有的方法,須要用修飾器"@classmethod"來標識其爲類方法。對於類方法,第一個參數必須爲類對象,已辦以"cls"做爲第一個參數(固然也能夠用其餘名稱的變量做爲第一個參數,但習慣以"cls"爲第一個參數),能夠經過實例對象和類對象去訪問。
class Country(object): name = 'china' # 類方法,用classmethod來標識 @classmethod def getprovince(cls): return cls.name c = Country() print(c.getprovince()) print(Country.getprovince())
類方法還有一個用途就是能夠對類屬性進行修改:
class people(object): country = 'china' #類方法,用classmethod來進行修飾 @classmethod def getCountry(cls): return cls.country @classmethod def setCountry(cls,country): cls.country = country p = people() print (p.getCountry()) #能夠用過實例對象引用 print (people.getCountry()) #能夠經過類對象引用 p.setCountry('Italy') print (p.getCountry()) print (people.getCountry())
運行結果:
china
china
Italy
Italy
運行結果顯示在使用類方法實例對象對類屬性修改以後,經過類對象和實例對象訪問都發生改變。
實例方法:在類中最常定義的成員方法,它至少有一個參數而且必須以實例對象做爲其第一個參數,通常以名爲'self'的變量做爲第一個參數(固然能夠以其餘名稱的變量做爲第一個參數)。在類外實例方法只能經過實例對象去調用,不能經過其餘方式去調用。
class people: country = 'china' #實例方法 def getCountry(self): return self.country p = people() print (p.getCountry()) #正確,能夠用過實例對象引用 print (people.getCountry()) #錯誤,不能經過類對象引用實例方法
靜態方法:須要經過修飾器"@staticmethod"來進行修飾,靜態方法不須要多定義參數。
class people(object): country = 'china' @staticmethod #靜態方法 def getCountry(): return people.country print (people.getCountry())
從類方法和實例方法以及靜態方法的定義形式就能夠看出來,類方法的第一個參數是類對象cls,那麼經過cls引用的一定是類對象的屬性和方法;而實例方法的第一個參數是實例對象self,那麼經過self引用的多是類屬性、也有多是實例屬性(這個須要具體分析),不過在存在相同名稱的類屬性和實例屬性的狀況下,實例屬性優先級更高。靜態方法中不須要額外定義參數,所以在靜態方法中引用類屬性的話,必須經過類對象來引用。