最近在做一個許可權系統,期望的效果如下:
許可權部分是一個二級結構, contenttype.action
假定對外暴露的介面為 perms 變數,期望能通過 if perms.contentname 來判斷使用者是否擁有contentname中的任一action的許可權,通過 if perms.contentname.actionname來判斷使用者是否具有contentname下的actionname許可權。
為了方便使用者使用,決定使用python的操作符重載。
具體代碼如下:
class PermLookupDict(object):
def __init__(self, datas, content_name):
self.datas = datas
self.content_name = content_name.strip()
def __repr__(self):
return "datas = %s, and content_name = %s" %(str(self.datas), self.content_name)
def __getitem__(self, perm_name):
return self.__getattr__(perm_name)
def __getattr__(self, perm_name ):
result = False
try:
perms = self.datas[self.content_name]
if perm_name.strip() in perms:
result = True
else:
result = False
except:
result = False
return result
def __nonzero__(self):
if self.datas.has_key( self.content_name ):
return True
else:
return False
class PermWrapper(object):
def __init__(self, datas):
self.datas = datas
def __getitem__(self, content_name ):
return self.__getattr__(content_name)
def __getattr__(self, content_name ):
return PermLookupDict(self.datas, content_name)
def __iter__(self):
# I am large, I contain multitudes.
raise TypeError("PermWrapper is not iterable.")
def __getstate__(self):
return self.__dict__
def __setstate__(self, d):
self.__dict__.update(d)
其中最主要的兩個操作符重載就是 PermLookupDict中的__nonzero__和__getattr__, if perms.contentname的最終調用函數就是__nonzero__