類和對象
面向過程和麪向對象的編程
面向過程的編程:函數式編程,c程序等
面向對象的編程:c++,JAVA ,python等
類和對象:是面向對象中的兩個重要概念
類:是對事物的抽象,比如:汽車模型(某一類事物的描述,屬性和方法)
對象:是類的一個實例,比如:qq轎車,大客車
範例說明:
汽車模型可以對汽車的特徵和行爲進行抽象,然後可以實例化爲一臺真實的汽車體現出來
Python類的定義:
python類的定義:
使用class關鍵字定義一個類,並且類名的首字母要大寫;
當程序員需要創建的類型不能用簡單類型表示時就需要創建類;
類把需要的變量和函數組合在一起, 這種包含稱之爲“封裝”;
python類的結構:
>>>class 類名:
... 成員變量
... 成員函數
...
類的創建:範例
#!/usr/bin/python #coding:utf8 class Ren: #class關鍵字,類別首字母大寫,這樣寫class Ren():也可以 name = "人" #屬性 high = "一人高" #屬性 wight = "一人重" #屬性 def run(self): #成員函數定義 print "跑步"
#注意類當中定義成員函數時和外邊定義函數時有區別,裏邊必須有一個形參,用來傳遞類當中的屬性和方法,但調用的時候是不需要傳參的
對象的創建:
創建對象的過程稱之爲實例化,當一個對象被創建後,包含三個方面的特性:對象的句柄、屬性和方法。
句柄用於區分不同的對象;
對象的屬性和方法與類中的成員變量和成員函數對應
#!/usr/bin/python #coding:utf8 class Ren: name = '人' high = '一人高' wight = '一人重' def run(self): #self 表示自己的類別 print '跑步' zhangsan = Ren() #從Ren 的類別中實例化一個對象 print zhangsan
[root@zabbix class]# python class.py <__main__.Ren instance at 0x7ff7f80110e0> #instance 實例 #列別中的實例(對象) #對象zhangsan具有屬性和方法,zhangsan的屬性就是類別中Ren的成員變量,方法就是類別中的函數
#屬性的訪問 (通過對象.)
..... print zhangsan.high [root@zabbix class]# python class.py 一人高
#對象屬性的重新賦值
....... zhangsan.name = "張三" print zhangsan.name [root@zabbix class]# python class.py 張三
#注意:對象是從類別中實例化出來的,它具有類別的屬性和方法,同時對象也是一個個體,可以有不一樣的.
zhangsan.money = "10000" print zhangsan.money [root@zabbix class]# python class.py 10000
Python對象的體系結構:
-經典對象:內部由屬性和方法組成,屬性可以是數據類型也可以是函數類型。
如果屬性爲函數則該屬性就是一個方法。
-新型對象-定義新型對象,必須繼承object方法class_name(object)
新型對象提供了對類方法和靜態方法的支持
.... class Ren(object):
類的屬性:
類有屬性和方法組成,類的屬性是對數據的封裝,類的方法則是對類的行爲的封裝。類的屬性按使用範圍分爲私有屬性和公有屬性,類的屬性範圍取決於屬性的名稱 。
公有屬性:所謂共有屬性就是在類中和類外調用的屬性
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' #公有屬性 high = '一人高' wight = '一人重' def run(self): print self.name #調用內部屬性,self代表本身,訪問自己,調用類的屬性 print '跑步' if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "張三" print zhangsan.name #外部訪問 zhangsan.run() print Ren.name #通過類名訪問屬性
私有屬性:不能被類以外的函數調用
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' high = '一人高' wight = '一人重' __money = '1000' #私有屬性 def run(self): print self.name print '跑步' if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "張三" print zhangsan.__money #此處打印私有屬性 [root@zabbix class]# python class.py Traceback (most recent call last): File "class.py", line 15, in <module> print zhangsan.__money AttributeError: 'Ren' object has no attribute '__money' #無法調用
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' high = '一人高' wight = '一人重' __money = '1000' def run(self): print self.name print '跑步' def say(self): #內部方法中調用 print self.__money if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "張三" print zhangsan.say() #通過內部調用方法顯示,實現對數據的封裝、隱藏
(可以通過instance._classname_attribute方式訪問,但只用於調式程序)
print zhangsan._Ren__money
定義方式:以“__”雙下劃線開始的成員變量就是私有屬性,否則就是公有屬性
內置屬性:有系統在定義類的時候默認添加的,由前後兩個下劃線構成__dict__,__module__
...... print Ren.__dict__ [root@zabbix class]# python class.py 人 ################################################## {'high': '\xe4\xb8\x80\xe4\xba\xba\xe9\xab\x98', '__module__': '__main__', 'run': <function run at 0x7f9ebdb60230>, 'name': '\xe4\xba\xba', '__dict__': <attribute '__dict__' of 'Ren' objects>, '__weakref__': <attribute '__weakref__' of 'Ren' objects>, '__doc__': None, 'wight': '\xe4\xb8\x80\xe4\xba\xba\xe9\x87\x8d', 'say': <function say at 0x7f9ebdb608c0>, '_Ren__money': '1000'}
類的方法:
方法的定義
和函數定義一樣,但是需要self作爲第一參數
類方法也分爲:公有方法和私有方法
私有方法:不能被外部類和方法調用,私有方法的定義和私有屬性 的定義都是一樣的,在方法的前面加上“__”雙下劃線就可以了。
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' __money = '我有十塊錢' def run(self): #公有方法 print self.name print '跑步' def say(self): print self.__money def ___lie(self): #私有方法 print "我很欣賞你" if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "張三" zhangsan.say() #可以打印 zhangsan.__lie() #無法打印
....... def say(self): #通過公有方法間接調用 print self.__money self.__lie() #self代表類本身
#如果要獲取多個私有屬性的值,可以通過傳參
....... def get(self,x): #添加形參 if x == "money": return self.__money else: return self.__age def __lie(self): print "我很欣賞你" ....... if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "張三" zm = zhangsan.get('age') #通過get方法取值 print zm
#通過方法設置私有屬性的值
#!/usr/bin/python #coding:utf8 class Ren(object): name = '人' __age = 30 def set(self,x): #通過方法設置值 self.__age = x if __name__ == '__main__': zhangsan = Ren() zhangsan.name = "張三" zhangsan.set(20) #修改值 print zhangsan._Ren__age #打印值
類方法:被classmethod()函數處理的函數,能被類所調用,也能被對象所調用(是繼承關係)
#!/usr/bin/python #coding:utf8 test = "globale" class Ren(object): name = '人' __money = '我有十塊錢' def run(self): print '跑步' if __name__ == '__main__': print Ren.name #直接訪問公有的屬性是可以 print Ren.run() #直接訪問公有的方法是不可以的 [root@zabbix class]# python 1.py 人 Traceback (most recent call last): File "1.py", line 12, in <module> print Ren.run() TypeError: unbound method run() must be called with Ren instance as first argument (got nothing instead) #類型錯誤,run()方法必須作爲一個實例調用
可以通過函數處理,直接調用
..... def moRi(self): print "世界末日" mr = classmethod(moRi) #通過classmethod 轉換,需另起名 if __name__ == '__main__': print Ren.name print Ren.mr() #直接調用(動態,不佔用內存)
靜態方法:相當於“全局函數”,可以被類直接調用,可以被所有實例化對象共享,通過staticmethod()定義,靜態方法沒有“self”語句
def moRi(): #靜態方法不需要self print "世界末日" mr = staticmethod(moRi) #通過staticmethod 轉換 if __name__ == '__main__': print Ren.name print Ren.mr() #注意不需要self調用類本身,表示運行類的時候,所有內部的屬性和方法已預先加載,直接調用即可
通過裝飾器,直接變爲類方法
......... @classmethod #裝飾器 def cass(self): print "動態" @staticmethod #裝飾器 def satic(): print "靜態" if __name__ == '__main__': print Ren.name print Ren.cass() print Ren.satic()
self參數:
用於區分函數和類的方法的(必須有一個self),self參數表示指示對象本身。