Python中關鍵字Class的定義和使用方法
類的定義
在 Python 中,class
是用來定義類的關鍵字。通過 class
關鍵字可以創(chuàng)建一個新的類,該類可以包含屬性和方法。類名通常使用大寫字母開頭的駝峰命名法。
定義類的基本語法:
class 類名: # 類名慣用駝峰式命名 # 類屬性(所有實例共享) 類屬性 = 值 # 構造方法(初始化對象) def __init__(self, 參數(shù)1, 參數(shù)2, ...): # 實例屬性(每個實例獨有) self.屬性1 = 參數(shù)1 self.屬性2 = 參數(shù)2 # 實例方法 def 方法名(self, 參數(shù)1, 參數(shù)2, ...): # 方法體 pass # 類方法(使用 @classmethod 裝飾器) @classmethod def 類方法名(cls, 參數(shù)1, 參數(shù)2, ...): # 方法體 pass # 靜態(tài)方法(使用 @staticmethod 裝飾器) @staticmethod def 靜態(tài)方法名(參數(shù)1, 參數(shù)2, ...): # 方法體 pass
初始化方法 (
__init__
)
當定義一個類時,通常會提供一個特殊的方法__init__()
來初始化新創(chuàng)建的對象的狀態(tài)。這個方法會在每次實例化對象時自動調用。
示例代碼如下:class Student: # 初始化方法(構造函數(shù)) def __init__(self, id, name, course): self.id = id # 實例屬性 self.name = name # 實例屬性 self.course = course # 實例屬性 # 實例方法 def show_data(self): print(f"ID:\t{self.id}") print(f"Name:\t{self.name}") print(f"Course:\t{self.course}") # 實例化對象并調用方法 student_obj = Student(1, 'Alice', 'Mathematics') student_obj.show_data()
輸出結果為:
ID: 1
Name: Alice
Course: Mathematics?
繼承與多態(tài)
繼承是面向對象編程的重要特性,它允許一個類繼承另一個類的屬性和方法。被繼承的類稱為基類(父類),繼承的類稱為派生類(子類)
子類可以通過 super()
函數(shù)來調用父類的構造函數(shù)或其他方法。
類的繼承
下面是一個簡單的繼承例子:
class ParentClass: def __init__(self, value): self.value = value def display_value(self): print(f"Value in parent class: {self.value}") class ChildClass(ParentClass): def __init__(self, value, extra_value): super().__init__(value) self.extra_value = extra_value def display_extra_value(self): print(f"Extra Value in child class: {self.extra_value}") child_instance = ChildClass(10, 20) child_instance.display_value() # 調用了父類的方法 child_instance.display_extra_value() # 調用了子類自己的方法
運行以上代碼的結果將是:
Value in parent class: 10
Extra Value in child class: 20
方法重寫
子類可以重寫父類的方法,以實現(xiàn)不同的行為。
# 父類 class Animal: def __init__(self, name): self.name = name def speak(self): return f"{self.name} makes a sound." # 子類 繼承于父類animal class Cat(Animal): def speak(self): return f"{self.name} says meow!" # 子類 重寫父類的speak方法 class Bird(Animal): def speak(self): return f"{self.name} says chirp!" # 創(chuàng)建子類對象 my_cat = Cat("Whiskers") print(my_cat.speak()) # 輸出: Whiskers says meow! my_bird = Bird("Tweety") print(my_bird.speak()) # 輸出: Tweety says chirp!
多繼承
Python 支持多繼承,即一個類可以繼承多個父類。
class A: def method(self): return "A" class B: def method(self): return "B" class C(A, B): pass my_object = C() print(my_object.method()) # 輸出: A(遵循方法解析順序 MRO)
靜態(tài)方法和類方法
靜態(tài)方法使用 @staticmethod 裝飾器定義,類方法使用 @classmethod 裝飾器定義。
class MyClass: @staticmethod def static_method(): print("This is a static method.") @classmethod def class_method(cls): print("This is a class method.") MyClass.static_method() # 輸出: This is a static method. MyClass.class_method() # 輸出: This is a class method.
靜態(tài)方法
裝飾有@staticmethod
標志的方法被視作靜態(tài)方法,既不需要傳入self
也不需傳遞cls
作為默認參數(shù)。這類方法實際上更接近于普通的全局輔助工具型函數(shù),在語法結構上只是掛載到了某特定類之下而已。類方法
使用裝飾器@classmethod
標記的方法被稱為類方法,它的首個隱含參數(shù)通常是代表類本身的cls
而非具體實例。因此,此類方法適用于那些需要處理整個類范圍內的事務場景下。class Example: count = 0 # 類屬性 def __init__(self, value): self.value = value # 實例屬性 @classmethod def increment_count(cls): cls.count += 1 # 修改類屬性 @staticmethod def static_method(): print("This is a static method.") def instance_method(self): return f"Value: {self.value}" # 訪問實例屬性
類的特殊方法
Python 中還存在一系列內置的特殊命名方法(即魔術方法),允許開發(fā)者自定義某些標準運算符或者語句的表現(xiàn)形式。
它們以雙下劃線開頭和結尾,例如 __str__()
, __repr__()
, 和容器相關的 __len__()
, __getitem__()
等等。合理運用這些魔法方法可以讓我們的類更加 Pythonic 并且易于與其他組件集成工作。
class Point: def __init__(self, x, y): self.x = x self.y = y # 重寫字符串表示 def __str__(self): return f"Point({self.x}, {self.y})" # 重寫加法操作 def __add__(self, other): return Point(self.x + other.x, self.y + other.y) # 使用 p1 = Point(1, 2) p2 = Point(3, 4) print(p1) # 輸出: Point(1, 2) print(p1 + p2) # 輸出: Point(4, 6)
類的封裝
- 封裝的意義
封裝是一種面向對象編程的核心特性之一,它允許將數(shù)據(jù)(屬性)和操作這些數(shù)據(jù)的方法組合在一起,并對外部隱藏不必要的細節(jié)。通過封裝,可以提高程序的安全性和可維護性。
在 Python 中,可以通過命名約定來定義不同級別的訪問權限:
公有屬性 (Public)
公有屬性可以直接被外部訪問和修改。
受保護屬性 (Protected)
受保護屬性以單下劃線 _ 開頭,表示該屬性僅應在類內部或其子類中使用。雖然可以從外部訪問,但這通常被視為一種慣例。
私有屬性 (Private)
私有屬性以雙下劃線 __ 開頭,Python 會對這類屬性進行名稱改寫(Name Mangling),從而防止從外部直接訪問。
class BankAccount: def __init__(self, owner, balance=0): self.owner = owner # 公有屬性 self._account_number = "A12345" # 受保護屬性 self.__balance = balance # 私有屬性 def deposit(self, amount): """存款""" if amount > 0: self.__balance += amount return f"Deposited {amount}. New balance: {self.__balance}" else: return "Invalid deposit amount." def withdraw(self, amount): """取款""" if 0 < amount <= self.__balance: self.__balance -= amount return f"Withdrew {amount}. Remaining balance: {self.__balance}" else: return "Insufficient funds or invalid withdrawal amount." def get_balance(self): """獲取余額""" return f"Current balance: {self.__balance}" # 測試BankAccount類的功能 account = BankAccount("Alice", 100) # 正常操作 print(account.deposit(50)) # 輸出: Deposited 50. New balance: 150 print(account.withdraw(70)) # 輸出: Withdrew 70. Remaining balance: 80 print(account.get_balance()) # 輸出: Current balance: 80 # 嘗試非法訪問私有屬性 try: print(account.__balance) # 這里會拋出 AttributeError 錯誤 except AttributeError as e: print(e) # 輸出: 'BankAccount' object has no attribute '__balance' # 使用名稱改寫的機制間接訪問私有屬性 print(account._BankAccount__balance) # 輸出: 80 【不推薦】
單例模式下的封裝應用除了基本的數(shù)據(jù)封裝外,在某些場景下可能還需要確保某個類只存在一個實例。這種需求可以通過重寫 __new__
方法并結合靜態(tài)變量實現(xiàn)單例模式。
以下是基于日志管理器的一個簡單示例:
class Logger: _instance = None # 靜態(tài)變量用于存儲唯一實例 def __new__(cls, *args, **kwargs): if not cls._instance: # 如果尚未創(chuàng)建過實例,則初始化一個新的實例 cls._instance = super(Logger, cls).__new__(cls) return cls._instance # 返回已存在的實例 def log(self, message): print(f"[LOG]: {message}") # 測試Logger類的行為 logger1 = Logger() logger2 = Logger() assert logger1 is logger2 # True,表明兩個引用指向同一個對象 logger1.log("System started.") # 輸出: [LOG]: System started. logger2.log("User logged in.") # 輸出: [LOG]: User logged in.
總結以上兩段代碼分別演示了常規(guī)封裝技術和單例設計模式中的封裝實踐。前者強調的是對敏感字段的有效隔離;后者則進一步擴展到整個類層面,保證資源使用的統(tǒng)一性。
總結
到此這篇關于Python中關鍵字Class的定義和使用方法的文章就介紹到這了,更多相關Python Class使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)針對json中某個關鍵字段進行排序操作示例
這篇文章主要介紹了Python實現(xiàn)針對json中某個關鍵字段進行排序操作,涉及Python json數(shù)組排序及l(fā)ambda表達式相關操作技巧,需要的朋友可以參考下2018-12-12python tqdm 實現(xiàn)滾動條不上下滾動代碼(保持一行內滾動)
這篇文章主要介紹了python tqdm 實現(xiàn)滾動條不上下滾動代碼(保持一行內滾動),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例
這篇文章主要介紹了詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例的相關資料,這里使用了線程知識,隊列知識及循環(huán)的知識,需要的朋友可以參考下2017-08-08