python中的操作符重載樣本

來源:互聯網
上載者:User

最近在做一個許可權系統,期望的效果如下:
許可權部分是一個二級結構, 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__

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.