Python 面向對象編程

  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引用的多是類屬性、也有多是實例屬性(這個須要具體分析),不過在存在相同名稱的類屬性和實例屬性的狀況下,實例屬性優先級更高。靜態方法中不須要額外定義參數,所以在靜態方法中引用類屬性的話,必須經過類對象來引用。

相關文章
相關標籤/搜索