首頁 > 軟體

Python基礎之類的定義和使用詳解

2022-08-23 14:02:10

在Python中,類表示具有相同屬性和方法的物件的集合。在使用類時,需要先定義類,然後再建立類的範例,通過類的範例就可以存取類中的屬性和方法了。

1、定義類

在Python中,類的定義使用class關鍵字來實現,語法如下:

class ClassName:
“”“類的幫助資訊”“” # 類文字字串
statement # 類體

引數說明

  • ClassName:用於指定類名,一般使用大寫字母開頭,如果類名中包括個詞,第二個單詞的首字母也要大寫,這種命名方法也稱為“駝峰式命名法”,這是慣例。當然,也可以根據自己的習慣命名,但是一般推薦按照慣例來命名。
  • “類的幫助資訊”:用於指定類的檔案字串。定義該字串後,在建立類的物件時,輸入類名和左側的括號“( ” 後,將顯示資訊。
  • statement:類體,主要由類變數(或類成員)、方法和屬性等定義語句組成。如果在定義類時,沒有想好類的具體功能,也可以在類體中直接使用Pass語句代替。
class Geese:
「」「大雁類」「」
pass

2、建立類的範例

定義完成後,並不會真正建立一個範例。這就好比一個汽車的設計圖。設計圖可以告訴你汽車看上去怎麼樣,但設計圖本身不是一個汽車。你不能開走它,它只能用來建造真正的汽車,而且可以使用它製造很多汽車。那麼如何建立範例呢?

class語句本身並不建立該類的任何範例。所以在類定義完成以後,可以建立類的範例,即範例化該類的物件。建立類的範例的語法如下:

ClassName(parameterlist)

引數說明

  • ClassName:是必選引數,用於指定類。
  • parameterlist:可以選引數,當建立一個類時,沒有建立__init__()方法,或者當__init__()方法只有一個self引數時, parameterlist可以省略。

例如,建立上面Geese類的範例,可以使用下面程式碼:

# 建立類
class Geese:
「」「大雁類」「」
pass

# 建立範例
wildGoose = Geese()
print(wildGoose)

執行上面程式碼後,將顯示類似下面的內容:

從上面的執行結果中可以看出,wildGoose是Geese類的範例。

3、“魔術”方法——_ init ()

在建立類後,類通常會自動建立一個__init_()方法。該方法是一個特殊的方法,類似JAVA 語言中的構造方法。

每當建立一個類的新範例時,Python都會自動執行它。init()方法必須包含一個引數,並且必須是第一引數。self引數是一個指向範例本身的參照,用於存取類中的屬性和方法。

在方法呼叫時會自動傳遞實際引數self。因此,當__init__()方法只有一個引數時,在建立類的範例時,就不需要指定引數了。

例如,下面乃然以大雁為例,並建立__init__()方法,程式碼如下:

# 建立類
class Geese:
「」「大雁類」「」

def __init__(self):
    print("我是大雁類")

wildGoose = Geese()

執行以上程式碼,將輸出以下內容:

常見錯誤

在為類建立__init__()方法時,在開發環境中執行下面的程式碼:

# 建立類
class Geese:
「」「大雁類」「」

def __init__():             # 構建方法
    print("我是大雁類")

wildGoose = Geese() # 建立大雁範例

執行上述程式碼,將丟擲以下異常:

在__init__()方法中,除了self引數外,還可以自定義一些引數,引數間使用逗號“,”進行分隔。

例如,下面的程式碼將在建立__init__()方法時,再指定3個引數,分別是beak、wing和claw:

# 建立類
class Geese:
「」「大雁類」「」

def __init__(self, beak, wing, claw):
    print("我是大雁類!我有一下特徵:")
    print(beak)
    print(wing)
    print(claw)

beak_1 = 「喙」
wing_1 = 「翅膀」
claw_1 = 「爪」
wildGoose = Geese(beak_1, wing_1, claw_1)

執行上面程式碼,將顯示以下結果:

4、建立類的成員並存取

類的成員主要由實體方法和資料成員組成。在類中建立了類的成員後,可以通過類的範例進行存取。下面進行詳細介紹。

4.1、建立實體方法並存取

所謂實體方法是指在類中定義函數。該函數是一種在類的範例上操作的函數。同__init__()方法一樣,實體方法的第一引數必須是self,並且必須包含一個self引數。建立範例的方法的語法格式如下:

def functionName(self,parameterlist):
    block

引數說明

  • functionName:用於指定方法名,一般使用小寫字母開頭。
  • self:必要引數,表示類的範例,其名稱可以是self以外的單詞,使用self只是一個習慣而已。
  • parameterlist:用於指定除self引數以外的引數,各引數間使用逗號“,”進行分隔。
  • block:方法體,實現的具體功能

範例建立完成後,可以通過類的範例名稱和點(.)操作符進行存取。具體的語法格式如下:

instanceName.functionName(parametervalue)

引數說明

  • instanceName:為類的範例名稱
  • functionName:為要呼叫的方法名稱
  • parametervalue:表示為方法指定對應的實際引數,其值的個數與建立實體方法中parameterlist的個數相同。

4.2、建立資料成員並存取

資料成員是指類中定義的變數,即屬性,根據定義位置,又可以分為類屬性和範例屬性,下面分別進行介紹。

類屬性

類屬性是指在定義類中,並且在函數體外的屬性。類屬性可以在類的所有範例之間共用值,也就是在所有範例化的物件中公用。

例如,定義一個雁類,在該類中定義3個屬性,用於記錄雁的特徵,程式碼如下:

class Geese:
    """大雁類"""
    beak_1 = "喙,比較尖"  # 定義類屬性(喙)
    wing_1 = "翅膀,比較大" 
    claw_1 = "爪,行走自如"

    def __init__(self):
        print("我是大雁類!我有一下特徵:")
        print(Geese.beak_1)   # 輸出喙的屬性
        print(Geese.wing_1)
        print(Geese.claw_1)

建立上面的類Geese,然後建立類的範例,程式碼如下:

goose = Geese()  # 範例化一個雁的物件

執行上面程式碼建立Geese類的範例後,將顯示以下內容:

範例屬性

範例屬性是指定義在類的方法中的屬性,只作用於當前範例中。

例如,定義一個雁類Geese,在該類的__init__()方法中定義3個範例屬性,用於記錄雁類的特徵,程式碼如下:

# 建立類
class Geese:
    """大雁類"""
    def __init__(self):
        self.beak_1 = "喙,比較尖"  # 定義範例屬性(喙)
        self.wing_1 = "翅膀,比較大"
        self.claw_1 = "爪,行走自如"
        print("我是大雁類!我有一下特徵:")
        print(self.beak_1)   # 輸出喙的屬性
        print(self.wing_1)
        print(self.claw_1)

建立上面的類Geese,然後建立類的範例,程式碼如下:

goose = Geese()  # 範例化一個雁的物件

執行上面程式碼建立Geese類的範例後,將顯示以下內容:

說明

範例屬性只能通過範例名存取。如果通過類名存取範例屬性,將丟擲如圖所示的異常。

對於範例的屬性也可以通過範例名稱修改,與類不同,通過範例名稱修改範例屬性後,並不能影響該類的其他範例中相應的範例屬性值。

例如,定義一個雁類,並在__init__()方法中定義一個範例屬性,然後建立兩個Geese類的範例,並修改一個範例屬性,最後分別輸出範例屬性,程式碼如下:

# 建立類
class Geese:
    """大雁類"""
    

    def __init__(self):
        self.beak_1 = "喙,比較尖"  # 定義範例屬性(喙)
        print(self.beak_1) # Python學習交流君羊 279199867


goose1 = Geese()  # 建立Geese範例1
goose2 = Geese()  # 建立Geese範例2
goose1.beak_1 = "喙,比長鵝尖"  # 修改範例屬性
print("goose1的beak_1屬性:", goose1.beak_1)
print("goose2的beak_1屬性:", goose2.beak_1)

執行上面程式碼,將顯示以下內容:

5、存取限制

在類的內部可以定義屬性和方法,而在類的外部則可以直接呼叫屬性或方法來運算元據,從而隱藏了類內部的複雜邏輯。但Python並沒有對屬性和方法的存取許可權進行限制。

為了保證類內部的某些屬性或方法不被外部所存取,可以在屬性或方法名前面新增單下劃線(_foo)、雙下劃線(__foo)或者首尾加雙下劃線( __ foo __),從而限制存取許可權。

其中,單下劃線、雙下劃線、首尾雙下劃線的作用如下:

  • __ foo __ :首尾雙下劃線表示定義特殊方法,一般是系統定於名字,如__init__()。
  • _foo:以單下劃線開頭的表示protected(保護)型別的成員,只允許類本身或子類存取,但不能使用“ from module impor”語句匯入。

例如,建立一個Swan類,定義保護屬性_neck_swan,並在__init__()方法中存取該屬性,然後建立Swan類的範例,並通過範例名輸出保護屬性_neck_swan,程式碼如下:

class Swan:
    """天鵝類"""
    _neck_swan = "天鵝脖子長"  # 建立私有屬性

    def __init__(self):
        print("__init__():", Swan._neck_swan)


swan = Swan()  # 建立Swan類
print("直接存取:", swan._neck_swan)

執行以上程式碼,將顯示以下內容:

從上面的執行結果中可以看出:保護屬性可以通過範例名存取。

__foo:雙下劃線表示private(私有)型別的成員,只允許定義該方法的類本身進行存取,而且也不能通過類的範例進行存取,但是可以通過“類的範例名.類名 __xxx”方式存取。

例如,建立一個Swan類,定義保護屬性__neck_swan,並在__init__()方法中存取該屬性,然後建立Swan類的範例,並通過範例名輸出保護屬性__neck_swan,程式碼如下:

class Swan:
    """天鵝類"""
    __neck_swan = "天鵝脖子長"  # 建立私有屬性

    def __init__(self):
        print("__init__():", Swan.__neck_swan)


swan = Swan()  # 建立Swan類
print("加入類名:", swan._Swan__neck_swan)
print("直接存取:", swan.__neck_swan)

執行上面程式碼,將輸出如圖所示的結果:

從上面的執行結果可以看出:私有屬性可以通過“類名.屬性名”方式存取,也可以通過“範例名.類名__xxx”方式存取,但是不能直接通過“範例名.屬性名”方式存取。

以上就是Python基礎之類的定義和使用詳解的詳細內容,更多關於Python類的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com