1、首先定义三种用户类型:普通用户、管理员、超级管理员,不同用户类型的用户权限关系如下:



先看一段代码:
 class Scope():  # 定义一个基类,因为每个权限类都需要add()方法
allow_api = [] def add(self, other):
self.allow_api = self.allow_api + other.allow_api
return self class UserScope(Scope): # 普通用户权限
allow_api = ['权限A'] class AdminScope(Scope): # 管理员权限(管理员权限=管理员权限+普通用户权限)
allow_api = ['权限B'] def __init__(self):
self.add(UserScope()) class SuperScope(Scope): # 超级管理员(超级管理员权限=超级管理员权限+管理员权限+普通用户权限)
allow_api = ['权限C'] def __init__(self):
self.add(AdminScope()) u = UserScope()
a = AdminScope()
s = SuperScope()
print('普通用户 ',u.allow_api)
print('管理员 ',a.allow_api)
print('超级管理员',s.allow_api)
执行结果:
普通用户   ['权限A']
管理员 ['权限B', '权限A']
超级管理员 ['权限C', '权限B', '权限A']

总结:其实上面代码理解起来也通俗易懂,即使出现重复权限,也可以通过集合单独改造去重,但是这里想升级一下,使用到__add__这个魔法方法

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

 class Scope():  # 定义一个基类,因为每个权限类都需要add()方法
allow_api = [] def __add__(self, other):
self.allow_api = self.allow_api + other.allow_api
return self class UserScope(Scope): # 普通用户权限
allow_api = ['权限A'] class AdminScope(Scope): # 管理员权限(管理员权限=管理员权限+普通用户权限)
allow_api = ['权限B'] def __init__(self):
self + UserScope() class SuperScope(Scope): # 超级管理员(超级管理员权限=超级管理员权限+管理员权限+普通用户权限)
allow_api = ['权限C'] def __init__(self):
self + AdminScope() + UserScope() u = UserScope()
a = AdminScope()
s = SuperScope()
print('普通用户 ', u.allow_api)
print('管理员 ', a.allow_api)
print('超级管理员', s.allow_api)

执行结果:

普通用户   ['权限A']
管理员 ['权限B', '权限A']
超级管理员 ['权限C', '权限B', '权限A', '权限A']

效果一样,但是出现了重复权限,所以下一步就是去重:

 class Scope():  # 定义一个基类,因为每个权限类都需要add()方法
allow_api = [] def __add__(self, other):
self.allow_api = list(set(self.allow_api + other.allow_api))
return self class UserScope(Scope): # 普通用户权限
allow_api = ['权限A'] class AdminScope(Scope): # 管理员权限(管理员权限=管理员权限+普通用户权限)
allow_api = ['权限B'] def __init__(self):
self + UserScope() class SuperScope(Scope): # 超级管理员(超级管理员权限=超级管理员权限+管理员权限+普通用户权限)
allow_api = ['权限C'] def __init__(self):
self + AdminScope() + UserScope() u = UserScope()
a = AdminScope()
s = SuperScope()
print('普通用户 ', u.allow_api)
print('管理员 ', a.allow_api)
print('超级管理员', s.allow_api)

执行结果:

普通用户   ['权限A']
管理员 ['权限A', '权限B']
超级管理员 ['权限A', '权限B', '权限C']
总结:其实也就是在遇到“+”这个符号的时候,会调用__add__方法。
   效果都是一样的,但是感觉这样才是真正用到python。。。

 

__add__,关于运算符重载(用户权限)的更多相关文章

  1. Oracle-3 - :超级适合初学者的入门级笔记--用户权限,set运算符,高级子查询

    上一篇的内容在这里第二篇内容, 用户权限:创建用户,创建角色,使用grant  和 revoke 语句赋予和回收权限,创建数据库联接 创建用户:create user xxx identified b ...

  2. Python全栈工程师(异常(高级)、运算符重载)

    ParisGabriel              每天坚持手写  一天一篇  决定坚持几年 为了梦想为了信仰    开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr ...

  3. C++学习笔记-运算符重载

    运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...

  4. 【dart学习】之运算符重载

    一,什么是运算符重载(operator overloading) 在软件开发过程中,运算符重载(英语:operator overloading)是多态的一种.运算符重载通常只是一种语法糖,这种语法对语 ...

  5. C#高级编程笔记2016年10月12日 运算符重载

    1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...

  6. C++运算符重载

    C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...

  7. c/c++面试题(6)运算符重载详解

    1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...

  8. C++运算符重载详解

    1.什么是运算符重载 运算符重载是一种函数重载. 运算符函数的格式:operatorop(argument-list)例如,operator+()重载+运算符.其中的op,必须是有效的C++运算符,如 ...

  9. C++中的运算符重载注意事项

    1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...

随机推荐

  1. Java_Scanner和System类

    目录 Scanner类(util包) System类(lang包) Scanner类(util包) Scanner类是一个不可变的类,实现了迭代器接口.一个简单的文本扫描器,可以使用正则表达式解析原始 ...

  2. 《剑指offer》二叉搜索树和双向链表

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  3. 在Windows环境下搭建Nginx文件服务器(简单实用版)

    为了解决项目组内容应用,打算把本地的e:tools目录共享出来,具体操作步骤如下1.下载安装包:http://nginx.org/download/nginx-1.9.15.zip2.解压缩3.修改配 ...

  4. Mysql的性能优化

    1.参考书籍:MYSQL 5.5从零开始学 Mysql性能优化就算通过合理安排资源,调整系统参数使MYSQL运行更快,更节省资源.MYSQL性能优化包括查询速度优化,更新速度优化,mysql服务器优化 ...

  5. CodeForces - 833B The Bakery

    题解: 线段树经典应用 首先暴力$f[i][j]$表示考虑前i位分成j段的最大值 转移$f[k][j-1]+cost(k+1,i)$枚举k转移 不同数的经典套路就是从它到它前驱这一段 于是维护每个数前 ...

  6. matplotlib 3D数据-【老鱼学matplotlib】

    直接上代码: import numpy as np import matplotlib.pyplot as plt # 导入显示3D的库 from mpl_toolkits.mplot3d impor ...

  7. spark MLlib collaborativeFilltering学习

    package ML.collaborativeFilltering; import org.apache.spark.SparkConf; import org.apache.spark.api.j ...

  8. js 在echarts多条折线图数字*100 诡异出现小数

    formatter:function(params){ //数据单位格式化 ].name; //x轴名称 , l = params.length; i < l; i++) { if(params ...

  9. HttpWebRequest简单使用

    HttpWebRequest简单使用  摘要 HttpWebRequest类对WebRequest中定义的属性和方法提供支持,也对使用户能够直接与使用HTTP的服务器交互的附加属性和方法提供支持. 创 ...

  10. Round#534 div.2-C Grid game

    http://codeforces.com/contest/1104/problem/C 好厉害的题~ 只要把竖着的放在第一第二行,横着的放在第三/第四行就行. 哦吼,大半夜脑子迷糊地看英文的脑筋急转 ...