__add__,關於運算符重載(用戶權限)
阿新 • • 發佈:2018-10-27
魔法 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__,關於運算符重載(用戶權限)