一、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
微信掃一掃
支付寶掃一掃