Naposledy aktivní 10 months ago

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

timmy revidoval tento gist 10 months ago. Přejít na revizi

1 file changed, 141 insertions

user_class_with_mixins.py(vytvořil soubor)

@@ -0,0 +1,141 @@
1 + import datetime
2 + import json
3 + import traceback
4 +
5 + class 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 +
13 + class 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 +
27 + class 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 +
44 + class 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 +
68 + class 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 +
86 + class 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 +
97 + class 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 + # 測試範例
114 + if __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) # 觸發除零錯誤
Novější Starší