Python 面向对象编程
python是一門解釋語音,但是它是面向對象的,可以進行對象編程。在進行python面向對象編程之前,先來了解幾個術語:類、類對象、實例對象、屬性、函數和方法。
一、如何定義一個類?
class people(object): #新式類 blockclass 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中的函數、方法和屬性的區別。
在上面的代碼中注釋中,我們知道sex是一個屬性,func()是一個方法,與某個對象進行綁定的函數叫做方法。在類中定義的函數與類對象或者實例對象綁定了,所以稱作方法。而類外定義的函數一般沒有進行綁定,就稱作函數。
二、屬性
在類中,我們可以定義一些屬性,比如:
class animal(object):name = 'dog'age = 2a = animal()print(a.name,a.age)定義一個animal類,里面定義了name和age屬性。在定義類之后,就可以來產生實例化對象,a = animal()就產生了一個實例化對象a,這里name和age都是公有屬性,可以在類外直接通過對象名訪問,如果想定義成私有的,就在屬性前面加上兩個下劃線'__'
class animal(object):__name = 'dog'__age = 2a = 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個下劃線'__')
三、方法
在類中可以根據需要定義一些方法,定義方法采用def關鍵字,在類中定義的方法至少會有一個參數,一般以名為'self'的變量作為該參數,而且作為第一個參數。下面來看個例子:
class human(object):__name = 'Jack'__age = 24def getname(self):return self.__namedef getage(self):return self.__agem = human()print(m.getname())print(m.getage())?四、類中內置的方法
在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 = agep = 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來標識 @classmethoddef getprovince(cls):return cls.namec = Country()print(c.getprovince()) print(Country.getprovince())類方法還有一個用途就是可以對類屬性進行修改:
class people(object):country = 'china'#類方法,用classmethod來進行修飾 @classmethoddef getCountry(cls):return cls.country@classmethoddef setCountry(cls,country):cls.country = countryp = 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.countryp = people() print (p.getCountry()) #正確,可以用過實例對象引用 print (people.getCountry()) #錯誤,不能通過類對象引用實例方法?
靜態方法:需要通過修飾器"@staticmethod"來進行修飾,靜態方法不需要多定義參數。
class people(object):country = 'china'@staticmethod#靜態方法def getCountry():return people.countryprint (people.getCountry())從類方法和實例方法以及靜態方法的定義形式就可以看出來,類方法的第一個參數是類對象cls,那么通過cls引用的必定是類對象的屬性和方法;而實例方法的第一個參數是實例對象self,那么通過self引用的可能是類屬性、也有可能是實例屬性(這個需要具體分析),不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性優先級更高。靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類對象來引用。
轉載于:https://www.cnblogs.com/wuxiaoyu-1537/p/7615680.html
總結
以上是生活随笔為你收集整理的Python 面向对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机无线网络服务禁用了怎么办,Win1
- 下一篇: matlab拟合RMSE,Matlab拟