一、類的定義
在Python中,類(class)是一種數據類型,可以理解為一個模板,通過定義類可以創建一個新的對象(實例),並可以給這個對象賦予屬性和方法。具體定義方式為:
class 類名:
# 定義屬性
屬性名 = 屬性值
# 定義方法
def 方法名(self, 參數):
# 方法體
其中,屬性可以是類變數(即所有實例共用的屬性),也可以是實例變數(每個實例擁有獨立的屬性值)。而方法則可以是普通方法(至少有一個self參數,用於指向對象本身),也可以是類方法(使用@classmethod裝飾器修飾,第一個參數為cls,指向類本身)或靜態方法(使用@staticmethod裝飾器修飾,沒有默認參數指向對象或類)。以下實例可以更好地展示類的定義過程:
class Person:
# 類變數
species = '人類'
# 初始化方法
def __init__(self, name, age):
# 實例變數
self.name = name
self.age = age
# 普通方法
def say_hello(self):
print('你好,我是', self.name)
# 類方法
@classmethod
def change_species(cls, new_species):
cls.species = new_species
# 靜態方法
@staticmethod
def is_adult(age):
return age >= 18
# 創建實例
p1 = Person('Tom', 20)
p2 = Person('Jerry', 15)
# 訪問屬性和方法
print(p1.species)
p1.say_hello()
Person.change_species('智人')
print(p2.species)
print(Person.is_adult(20))
二、繼承和多態
在類的定義中,可以使用繼承(inheritance)來實現代碼的重用,也可以使用多態(polymorphism)來增強代碼的靈活性。繼承是一種從已有類派生出新類的機制,即子類(subclass)可以繼承父類(superclass)的屬性和方法,並可以添加自己的屬性和方法。
class Animal:
def __init__(self, name):
self.name = name
def make_sound(self):
print('我是動物')
class Dog(Animal):
def make_sound(self):
print('汪汪汪!')
class Cat(Animal):
def make_sound(self):
print('喵喵喵!')
d = Dog('旺財')
c = Cat('湯姆')
d.make_sound()
c.make_sound()
以上代碼中,Animal類為父類,Dog類和Cat類為子類,子類可以復用父類的初始化方法__init__和方法make_sound,並可以重寫(override)make_sound方法以實現自己的功能。
而多態則是一種根據傳入參數的不同,而表現出不同的行為方式。具體實現方式為,在函數(方法)中傳入一個父類對象,在運行時會根據所傳入的實際子類對象而執行對應子類的方法。以下實例可以更好地展示多態的應用:
def animal_sound_analyzer(animal):
animal.make_sound()
a1 = Animal('動物')
a2 = Dog('狗')
a3 = Cat('貓')
animal_sound_analyzer(a1)
animal_sound_analyzer(a2)
animal_sound_analyzer(a3)
三、封裝和屬性裝飾器
在類中,可以使用封裝(encapsulation)來隱藏對象的屬性和方法,從而增強數據的安全性。具體實現方式為在屬性和方法前加上雙下劃線(__),即將其定義為私有成員。而在外部想要訪問或修改私有成員,則需要通過getter和setter方法進行操作。而Python的屬性裝飾器則提供了更加方便的方式。
class BankAccount:
def __init__(self, name, balance):
# 私有變數
self.__name = name
self.__balance = balance
@property
def name(self):
return self.__name
@property
def balance(self):
return self.__balance
# setter方法
@balance.setter
def balance(self, new_balance):
if new_balance >= 0:
self.__balance = new_balance
else:
print('存款不能為負數')
a = BankAccount('張三', 100)
print(a.name)
print(a.balance)
a.balance = -200
print(a.balance)
以上代碼中,BankAccount類中的name和balace屬性都是私有變數,通過@property裝飾器定義getter方法,然後通過@balance.setter裝飾器定義setter方法,從而達到保護屬性的目的。
四、抽象類和介面
在對象的繼承中,有時候父類中的方法只是用作規範,而不會被具體實現,這時候可以使用抽象類和介面的概念。抽象類(abstract class)是一種不能直接實例化的類,其中至少有一個方法為抽象方法(abstractmethod),即只有方法名而沒有實現的方法,子類必須重寫這個方法才能實例化。而介面(interface)則更為嚴格,它是一種全部方法都為抽象方法的抽象類,子類必須實現所有方法才能實例化。
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
@abstractmethod
def perimeter(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return (self.width + self.height) * 2
r = Rectangle(3, 4)
print(r.area())
print(r.perimeter())
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return self.radius ** 2 * 3.14
def perimeter(self):
return self.radius * 2 * 3.14
c = Circle(4)
print(c.area())
print(c.perimeter())
以上代碼中,Shape類是一個抽象類,其中定義了兩個抽象方法area和perimeter。而Rectangle類和Circle類繼承了Shape類,並分別實現了area和perimeter方法。如果子類沒有實現所有的抽象方法,則無法實例化。
五、總結
類是 Python 中非常重要的一種數據類型,它可以將一些重複性的代碼封裝成一個類,簡化代碼,並且是實現代碼復用、靈活性增強、安全性保護等的重要方式。在實際的開發過程中,需要學習掌握類的定義、繼承和多態、封裝和屬性裝飾器、抽象類和介面,才能更好地進行代碼開發和升級維護。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/308745.html