一、Python類的基本概念
Python中的類是一種自定義數據類型,允許我們定義自己的數據結構,包括數據屬性(成員變量)和方法(成員函數),並支持面向對象編程中的封裝、繼承和多態等特性。類是一種模板,可以通過實例化獲得對象,每個對象具有相同的屬性和方法,但這些屬性可能具有不同的值。
Python中使用class來定義類,一般的語法格式為:
class 類名[(父類名)]: def __init__(self[, 參數1, 參數2... ]): self.成員變量1 = 初始值1 self.成員變量2 = 初始值2 ... def 成員方法1(self[, 參數1, 參數2... ]): 方法體1 def 成員方法2(self[, 參數1, 參數2... ]): 方法體2 ...
其中,__init__(self[, 參數1, 參數2… ])是類的構造函數(或初始化函數),用於定義對象的屬性;成員方法是類的函數,用於實現對象的行為。self代表對象本身,相當於C++中的this指針。
二、Python類的繼承和多態
Python支持繼承,一個類可以從另一個類中繼承屬性和方法,被繼承的類稱為父類或基類,繼承它的類稱為子類或派生類。子類可以重寫父類的方法,實現多態,調用同一個方法時可以根據對象類型的不同產生不同的行為。Python中支持多重繼承,一個類可以同時繼承多個父類。
可以使用super()函數來調用父類的方法,格式為super(子類名, self).父類方法名(參數列表)。
例如,定義一個Animal類,具有基本的屬性和方法,然後定義Dog類和Cat類繼承自Animal類,並實現自己的特殊方法。代碼如下:
class Animal: def __init__(self, name, age, sex): self.name = name self.age = age self.sex = sex def run(self): print("I'm running!") class Dog(Animal): def __init__(self, name, age, sex, breed): super(Dog, self).__init__(name, age, sex) self.breed = breed def bark(self): print("I'm a dog, I'm barking!") class Cat(Animal): def __init__(self, name, age, sex, coat): super(Cat, self).__init__(name, age, sex) self.coat = coat def mew(self): print("I'm a cat, I'm mewing!") dog = Dog("Tom", 3, "male", "Golden Retriever") cat = Cat("Lucy", 2, "female", "Siamese") print(dog.name, dog.age, dog.sex, dog.breed) dog.bark() print(cat.name, cat.age, cat.sex, cat.coat) cat.mew()
輸出結果為:
Tom 3 male Golden Retriever I'm a dog, I'm barking! Lucy 2 female Siamese I'm a cat, I'm mewing!
三、Python類的封裝和訪問控制
Python中可以使用屬性訪問和方法調用來訪問對象的屬性和方法,但是屬性和方法默認都是公有的,可以被類的外部訪問和修改。為了實現封裝,Python提供了一些訪問控制的方法。具體地,屬性和方法可以分為公有、私有和受保護三種類型,用下劃線進行命名約定,規則如下:
- 以單下劃線開頭(如_name)的屬性和方法表示保護,只能在類和子類中訪問,不建議在類外部使用。
- 以雙下劃線開頭(如__name)的屬性和方法表示私有,只能在類中訪問,無法在外部訪問。可以通過使用_get_name()和_set_name()方法來實現私有屬性的讀寫操作。
- 以雙下劃線開頭和結尾(如__init__())的方法表示特殊方法,如構造函數和析構函數。
例如,假設我們要定義一個人類,具有年齡屬性和show_age()方法,其中年齡屬性可以通過setter和getter方法進行讀寫。代碼如下:
class Person: def __init__(self, name, age): self._name = name self.__age = age def show_age(self): print("My age is", self.__age) def get_age(self): return self.__age def set_age(self, age): if age 200: print("Invalid age!") else: self.__age = age person = Person("John", 30) person.show_age() person.set_age(40) person.show_age() print(person.get_age()) person.__age = 50 # 私有屬性無法直接訪問 person.show_age()
輸出結果為:
My age is 30 My age is 40 40 My age is 40
四、Python類的靜態方法和類方法
Python中的方法支持普通方法、靜態方法和類方法三種類型。靜態方法和類方法是面向對象編程中常用的語法結構,可以無需創建對象即可使用,提高了代碼的復用性和可維護性。
靜態方法使用@staticmethod裝飾器進行聲明,沒有cls和self參數,可以被類和對象直接調用,通常用於對傳入的數據進行處理或轉換。
類方法使用@classmethod裝飾器進行聲明,第一個參數必須是cls,表示類本身,也可以被類和對象調用,通常用於對類屬性進行操作。
例如,假設我們要定義一個數學類,具有計算圓周率pi和求絕對值abs的靜態方法和求階乘factorial的類方法。代碼如下:
class Math: PI = 3.14159 @staticmethod def abs(x): return x if x > 0 else -x @staticmethod def pi(): return Math.PI @classmethod def factorial(cls, n): if n > 1: return n * cls.factorial(n - 1) else: return 1 print(Math.abs(-1)) print(Math.pi()) print(Math.factorial(5))
輸出結果為:
1 3.14159 120
五、Python類的特殊方法
Python中的類還可以通過特殊方法來實現一些有意義的操作,如__str__()方法用於返回對象的字符串表示形式,__eq__()方法用於比較兩個對象是否相等等。
例如,假設我們要定義一個向量類,具有加法、減法和乘法等運算,以及向量的長度、正方向和字符串表示等特殊方法。代碼如下:
class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) def __sub__(self, other): return Vector(self.x - other.x, self.y - other.y) def __mul__(self, other): return self.x * other.x + self.y * other.y def __len__(self): return round((self.x ** 2 + self.y ** 2) ** 0.5, 2) def __str__(self): return "({}, {})".format(self.x, self.y) def __eq__(self, other): return self.x == other.x and self.y == other.y v1 = Vector(2, 3) v2 = Vector(3, 4) print(v1 + v2) print(v1 - v2) print(v1 * v2) print(len(v1)) print(str(v1)) print(v1 == v2)
輸出結果為:
(5, 7) (-1, -1) 18 3.61 (2, 3) False
原創文章,作者:UKMD,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/138815.html