天天看點

Python中面向對象和類

目錄

​​面向對象​​

​​類的定義​​

​​類的通路​​

​​類的屬性和方法​​

​​繼承和多态​​

面向對象

Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中建立一個類和對象是很容易的。

面向對象:

  • 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的執行個體。
  • 方法:類中定義的函數。
  • 類變量:類變量在整個執行個體化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作為執行個體變量使用。
  • 資料成員:類變量或者執行個體變量用于處理類及其執行個體對象的相關的資料。
  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆寫(override),也稱為方法的重寫。
  • 執行個體變量:定義在 __init__() 方法中的變量,隻作用于目前執行個體的類,定義和使用時必須以 self作為字首,執行個體變量屬執行個體對象,隻能通過對象名通路;類變量屬于類,可以通過類名或者對象名都可以通路。
  • 繼承:即一個派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個派生類的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是模拟"是一個(is-a)"關系(例圖,Dog是一個Animal)。
  • 執行個體化:建立一個類的執行個體,類的具體對象。
  • 對象:通過類定義的資料結構執行個體。對象包括兩個資料成員(類變量和執行個體變量)和方法。

在Python中,可以動态地為自定義類和對象增加或者删除成員,這是Python動态類型特點的重要表現。Python類型的動态性使得我們可以動态為自定義類及其對象增加新的屬性和行為,稱為混入機制

類的定義

類名的首字母一般大寫(約定俗成),類的所有執行個體方法都必須至少有一個 self 參數,并且必須是第一個參數。在類的執行個體方法中通路執行個體屬性時,需要以self為字首。在外部通過對象調用對象方法時,并不需要傳遞self這個參數,但是如果在外部通過類調用方法則需要顯示為self參數傳值。self作為第一個參數名稱,實際上是可以改變的,并不一定必須叫self這個名字,隻是大家都習慣使用了這個名字了。類的方法與普通的函數隻有一個特别的差別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 。

class Student(object):     #object是繼承的父類,如果沒有可不寫,object是所有類的父類
    '''類的注釋,可以通過屬性 __doc__ 擷取其值'''
    name='xie'             #公有屬性,對象屬性
    _age=20                #私有屬性,隻有類内部才能通路
    __author__='xiaoxie'   #特殊屬性 __author__
    def __init__(self,pid):    #類的構造函數,第一個參數永遠是self,表示建立的執行個體本身
        self.pid=pid           #執行個體屬性,隻有執行個體變量能調用,不能使用Student類調用
    def Test(self):            #類的公有方法,類的方法與普通的函數隻有一個特别的差別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是self。
        print("名字是:",self.name)  #通路屬性時,需要加 self. 字首
        return("類的公有方法")
    def _Test2(self):              #類的私有方法
        return("類的私有方法,外部不能通路")      

類的通路

類的通路有兩種:屬性引用 和 類的執行個體化

屬性引用
>>print(Student.name)
xie
>>Student.Test(Student)    #需要自身作為參數
名字是 xie

類的執行個體化
>>stu=Student(29)
>>isinstance(stu, Student)  #可以使用内置的isinstance方法判斷一個對象是否是一個類的執行個體
True
>>print(stu.name)
xie
>>print(stu.pid)
29
>>stu.Test()
名字是 xie      

類的屬性和方法

公有屬性:name
私有屬性:_age
内置特殊屬性:
__doc__          就是類裡面通過 ''' ''' 的注釋内容
__name__         就是類的名字
__author__       也就是類的作者

公有方法:Test()
私有方法:Test2()

類方法:  被@classmethod()函數處理過的函數,能被類所調用,也能被對象所調用(是繼承的關系),第一個參數不是self而是cls(目前的類)
靜态方法: 相當于全局函數,可以被類直接調用,可以被所有執行個體化對象共享,通過@staticmethod()定義,靜态方法沒有 self 參數

構造方法:
       用于初始化類的内部狀态,Python提供的構造函數是__init__(); 
       __init__()方法是可選的,如果不提供,Python會給出一個預設的的init方法

析構方法:
       用于釋放對象占用的資源,Python提供的析構函數是del(); 
       del()也是可選的,如果不提供,則Python會在背景提供預設析構函數      

繼承和多态

當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)

class Father:
    money=100
    __money=1000                        //父類的私有屬性不能被繼承

    def run(self):
        print("這是父類的方法")

class Mother:
    money=500                           //父親有這個屬性,是以隻繼承父親的屬性
    height=170

    def run(self):
        print("這是母親的方法")

class Son(Father,Mother):               //同時繼承父親和母親,多重繼承
    def run(self):
        print("這是兒子的方法")           //重載父類的方法
        Father.run(self)                 //也可以調用父類的方法

jerry=Son()
print(jerry.money,jerry.height)
jerry.run()
// 100 170
// 這是兒子的方法
// 這是父類的方法