Ostatnio aktywny 10 months ago

此 Python 程式使用多個 Mixin,提供日誌記錄、時間標記、資料儲存、權限管理、事件監聽與異常處理功能,使 User 類別具備完整的資料管理與行為追蹤能力,適用於使用者管理與系統監控應用。

Rewizja 48f521c606bcab054ce545d8c4682ed71e53bd58

user_class_with_mixins.py Surowy
1import datetime
2import json
3import traceback
4
5class LoggingMixin:
6 """ 提供日誌功能的 Mixin 類別 """
7
8 def log(self, message):
9 """ 記錄日誌 """
10 timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
11 print(f"[{timestamp}] {self.__class__.__name__}: {message}")
12
13class TimestampMixin:
14 """ 提供時間標記功能的 Mixin 類別 """
15
16 def __init__(self, *args, **kwargs):
17 """ 設定物件的建立與更新時間 """
18 self.created_at = datetime.datetime.now()
19 self.updated_at = self.created_at
20 super().__init__(*args, **kwargs)
21
22 def update_timestamp(self):
23 """ 更新 updated_at 時間 """
24 self.updated_at = datetime.datetime.now()
25 self.log(f"更新時間標記: {self.updated_at}")
26
27class DatabaseMixin:
28 """ 模擬資料儲存功能的 Mixin 類別,支援 JSON 序列化 """
29 _database = {}
30
31 def save(self):
32 """ 儲存物件至模擬資料庫 """
33 DatabaseMixin._database[self.name] = json.dumps(self.__dict__, default=str)
34 self.log(f"資料已儲存: {self.name}")
35
36 @classmethod
37 def get(cls, name):
38 """ 從資料庫中獲取物件 """
39 data = cls._database.get(name, None)
40 if data:
41 return json.loads(data)
42 return None
43
44class PermissionMixin:
45 """ 提供權限管理的 Mixin 類別 """
46
47 def __init__(self, permissions=None, *args, **kwargs):
48 """ 初始化權限 """
49 self.permissions = permissions if permissions else []
50 super().__init__(*args, **kwargs)
51
52 def has_permission(self, perm):
53 """ 檢查是否擁有指定權限 """
54 return perm in self.permissions
55
56 def grant_permission(self, perm):
57 """ 賦予權限 """
58 if perm not in self.permissions:
59 self.permissions.append(perm)
60 self.log(f"已新增權限: {perm}")
61
62 def revoke_permission(self, perm):
63 """ 移除權限 """
64 if perm in self.permissions:
65 self.permissions.remove(perm)
66 self.log(f"已移除權限: {perm}")
67
68class EventMixin:
69 """ 提供事件監聽功能的 Mixin 類別 """
70 _events = {}
71
72 @classmethod
73 def on(cls, event_name, callback):
74 """ 訂閱事件 """
75 if event_name not in cls._events:
76 cls._events[event_name] = []
77 cls._events[event_name].append(callback)
78
79 @classmethod
80 def trigger(cls, event_name, *args, **kwargs):
81 """ 觸發事件 """
82 if event_name in cls._events:
83 for callback in cls._events[event_name]:
84 callback(*args, **kwargs)
85
86class ExceptionHandlingMixin:
87 """ 提供異常處理的 Mixin 類別 """
88
89 def handle_exception(self, func, *args, **kwargs):
90 """ 包裝方法,捕獲異常並記錄 """
91 try:
92 return func(*args, **kwargs)
93 except Exception as e:
94 self.log(f"發生異常: {e}")
95 traceback.print_exc()
96
97class User(LoggingMixin, TimestampMixin, DatabaseMixin, PermissionMixin, EventMixin, ExceptionHandlingMixin):
98 """ User 類別,擁有日誌、時間標記、資料儲存、權限管理、事件監聽、異常處理功能 """
99
100 def __init__(self, name, permissions=None):
101 super().__init__(permissions=permissions)
102 self.name = name
103 self.log(f"User '{self.name}' 已建立,建立時間: {self.created_at}")
104
105 def update_name(self, new_name):
106 """ 更新使用者名稱,並觸發事件 """
107 self.log(f"名稱從 '{self.name}' 變更為 '{new_name}'")
108 old_name = self.name
109 self.name = new_name
110 self.update_timestamp()
111 self.trigger("user_updated", old_name, new_name)
112
113# 測試範例
114if __name__ == "__main__":
115 # 訂閱使用者更新事件
116 def on_user_updated(old_name, new_name):
117 print(f"🔔 使用者名稱變更通知: {old_name}{new_name}")
118
119 User.on("user_updated", on_user_updated)
120
121 # 建立使用者 Alice,並設定權限
122 user1 = User("Alice", permissions=["read", "write"])
123 user1.save() # 儲存到模擬資料庫
124
125 # 更新名稱
126 user1.update_name("Alice_Wonderland")
127
128 # 檢查權限
129 print(f"Alice 是否有 'read' 權限?{user1.has_permission('read')}")
130 print(f"Alice 是否有 'delete' 權限?{user1.has_permission('delete')}")
131
132 # 賦予新權限
133 user1.grant_permission("delete")
134
135 # 從資料庫取得使用者
136 retrieved_user = User.get("Alice_Wonderland")
137 if retrieved_user:
138 print(f"從資料庫取得使用者: {retrieved_user}")
139
140 # 測試異常處理
141 user1.handle_exception(lambda: 1 / 0) # 觸發除零錯誤
142