知識點回顧
- 類的裝飾器
- 裝飾器思想的進一步理解:外部修改、動態
- 類方法的定義:內部定義和外部定義
作業:復習類和函數的知識點,寫下自己過去29天的學習心得,如對函數和類的理解,對python這門工具的理解等,未來再過幾個專題部分我們即將開啟深度學習部分。
一、類的裝飾器
①為類添加版本信息
def add_version(cls):cls.version = "1.0.0"return cls@add_version
class MyClass:passprint(MyClass.version) # 輸出:1.0.0
②強制檢查類方法實現
def check_interface(cls):required = ['save', 'load']for method in required:if not hasattr(cls, method):raise NotImplementedError(f"{method}() 必須被實現")return cls@check_interface
class DataProcessor:def save(self):pass# 若未實現load(),裝飾器會拋出異常def load(self):pass
③單例模式裝飾器
def singleton(cls):instances = {}def get_instance(*args, **kwargs):if cls not in instances:instances[cls] = cls(*args, **kwargs)return instances[cls]return get_instance@singleton
class AppConfig:def __init__(self):print("配置初始化")c1 = AppConfig() # 輸出:配置初始化
c2 = AppConfig()
print(c1 is c2) # 輸出:True
二、裝飾器思想:外部修改與動態特性
①動態日志記錄
def log_creation(cls):original_init = cls.__init__def new_init(self, *args, **kwargs):print(f"創建 {cls.__name__} 實例")original_init(self, *args, **kwargs)cls.__init__ = new_initreturn cls@log_creation
class User:def __init__(self, name):self.name = nameu = User("Alice") # 輸出:創建 User 實例
②條件性裝飾器應用
DEBUG = Truedef debug_decorator(cls):if DEBUG:cls.debug_mode = Trueprint(f"{cls.__name__} 進入調試模式")return cls@debug_decorator
class DataLoader:passprint(DataLoader.debug_mode) # 輸出:True
三、類方法的定義方式
①內部定義類方法
class Calculator:@classmethoddef add(cls, a, b):return a + bprint(Calculator.add(3,5)) # 輸出:8
②外部添加類方法
def multiply(cls, a, b):return a * bCalculator.multiply = classmethod(multiply)
print(Calculator.multiply(3,5)) # 輸出:15
③外部添加實例方法
def power(self, exponent):return self.value ** exponentclass Number:def __init__(self, value):self.value = valueNumber.power = powern = Number(2)
print(n.power(3)) # 輸出:8
四、綜合應用
# 裝飾器:自動注冊子類
class ProcessorRegistry:registry = {}@classmethoddef register(cls, name):def decorator(subclass):cls.registry[name] = subclassreturn subclassreturn decorator@ProcessorRegistry.register("csv")
class CSVProcessor:@classmethoddef process(cls, data):return f"處理CSV數據: {data}"# 外部添加處理方法
def json_process(cls, data):return f"處理JSON數據: {data}"@ProcessorRegistry.register("json")
class JSONProcessor:process = classmethod(json_process)# 使用處理器
print(ProcessorRegistry.registry["csv"].process("test.csv")) # 處理CSV數據
print(ProcessorRegistry.registry["json"].process("data.json")) # 處理JSON數據
關鍵點總結:
-
類裝飾器:通過包裝類實現批量功能注入
-
裝飾器優勢:非侵入式修改、動態組合功能
-
方法擴展:
-
內部定義:標準方式,結構清晰
-
外部添加:靈活擴展,適合框架開發
-
-
動態特性:運行時決定功能組合,提升代碼適應性
通過合理運用這些特性,可以構建出高擴展性和低耦合度的程序架構。