python 面向對象

類和對象


        面向過程和麪向對象的編程

               面向過程的編程:函數式編程,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參數表示指示對象本身。

            



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章