1. 程式人生 > >__add__,關於運算符重載(用戶權限)

__add__,關於運算符重載(用戶權限)

魔法 src turn 。。 list allow color () 運算

1、首先定義三種用戶類型:普通用戶、管理員、超級管理員,不同用戶類型的用戶權限關系如下:

技術分享圖片

先看一段代碼:
 1 class Scope():  # 定義一個基類,因為每個權限類都需要add()方法
 2     allow_api = []
 3 
 4     def add(self, other):
 5         self.allow_api = self.allow_api + other.allow_api
 6         return self
 7 
 8 
 9 class UserScope(Scope):  # 普通用戶權限
10     allow_api = [
權限A] 11 12 13 class AdminScope(Scope): # 管理員權限(管理員權限=管理員權限+普通用戶權限) 14 allow_api = [權限B] 15 16 def __init__(self): 17 self.add(UserScope()) 18 19 20 class SuperScope(Scope): # 超級管理員(超級管理員權限=超級管理員權限+管理員權限+普通用戶權限) 21 allow_api = [權限C] 22 23 def __init__(self):
24 self.add(AdminScope()) 25 26 27 u = UserScope() 28 a = AdminScope() 29 s = SuperScope() 30 print(普通用戶 ,u.allow_api) 31 print(管理員 ,a.allow_api) 32 print(超級管理員,s.allow_api)

執行結果:
普通用戶   [權限A]
管理員     [權限B, 權限A]
超級管理員 [權限C, 權限B, 權限A]

總結:其實上面代碼理解起來也通俗易懂,即使出現重復權限,也可以通過集合單獨改造去重,但是這裏想升級一下,使用到__add__這個魔法方法

2、升級,改造add()方法:

 1 class Scope():  # 定義一個基類,因為每個權限類都需要add()方法
 2     allow_api = []
 3 
 4     def __add__(self, other):
 5         self.allow_api = self.allow_api + other.allow_api
 6         return self
 7 
 8 
 9 class UserScope(Scope):  # 普通用戶權限
10     allow_api = [權限A]
11 
12 
13 class AdminScope(Scope):  # 管理員權限(管理員權限=管理員權限+普通用戶權限)
14     allow_api = [權限B]
15 
16     def __init__(self):
17         self + UserScope()
18 
19 
20 class SuperScope(Scope):  # 超級管理員(超級管理員權限=超級管理員權限+管理員權限+普通用戶權限)
21     allow_api = [權限C]
22 
23     def __init__(self):
24         self + AdminScope() + UserScope()
25 
26 
27 u = UserScope()
28 a = AdminScope()
29 s = SuperScope()
30 print(普通用戶  , u.allow_api)
31 print(管理員    , a.allow_api)
32 print(超級管理員, s.allow_api)

執行結果:

普通用戶   [權限A]
管理員     [權限B, 權限A]
超級管理員 [權限C, 權限B, 權限A, 權限A]

效果一樣,但是出現了重復權限,所以下一步就是去重:

 1 class Scope():  # 定義一個基類,因為每個權限類都需要add()方法
 2     allow_api = []
 3 
 4     def __add__(self, other):
 5         self.allow_api = list(set(self.allow_api + other.allow_api))
 6         return self
 7 
 8 
 9 class UserScope(Scope):  # 普通用戶權限
10     allow_api = [權限A]
11 
12 
13 class AdminScope(Scope):  # 管理員權限(管理員權限=管理員權限+普通用戶權限)
14     allow_api = [權限B]
15 
16     def __init__(self):
17         self + UserScope()
18 
19 
20 class SuperScope(Scope):  # 超級管理員(超級管理員權限=超級管理員權限+管理員權限+普通用戶權限)
21     allow_api = [權限C]
22 
23     def __init__(self):
24         self + AdminScope() + UserScope()
25 
26 
27 u = UserScope()
28 a = AdminScope()
29 s = SuperScope()
30 print(普通用戶  , u.allow_api)
31 print(管理員    , a.allow_api)
32 print(超級管理員, s.allow_api)

執行結果:

普通用戶   [權限A]
管理員     [權限A, 權限B]
超級管理員 [權限A, 權限B, 權限C]

總結:其實也就是在遇到“+”這個符號的時候,會調用__add__方法。
   效果都是一樣的,但是感覺這樣才是真正用到python。。。

__add__,關於運算符重載(用戶權限)