__add__,关于运算符重载(用户权限)
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__,关于运算符重载(用户权限)的更多相关文章
- Oracle-3 - :超级适合初学者的入门级笔记--用户权限,set运算符,高级子查询
上一篇的内容在这里第二篇内容, 用户权限:创建用户,创建角色,使用grant 和 revoke 语句赋予和回收权限,创建数据库联接 创建用户:create user xxx identified b ...
- Python全栈工程师(异常(高级)、运算符重载)
ParisGabriel 每天坚持手写 一天一篇 决定坚持几年 为了梦想为了信仰 开局一张图 Python人工智能从入门到精通 对象的属性管理函数: getattr ...
- C++学习笔记-运算符重载
运算符重载使得用户自定义的数据以一种更简洁的方式工作 运算符重载规则 重载运算符的限制 可以重载的运算符 + - * / % ^ & | ~ ! = < > += -= *= /= ...
- 【dart学习】之运算符重载
一,什么是运算符重载(operator overloading) 在软件开发过程中,运算符重载(英语:operator overloading)是多态的一种.运算符重载通常只是一种语法糖,这种语法对语 ...
- C#高级编程笔记2016年10月12日 运算符重载
1.运算符重载:运算符重重载的关键是在对象上不能总是只调用方法或属性,有时还需要做一些其他工作,例如,对数值进行相加.相乘或逻辑操作等.例如,语句if(a==b).对于类,这个语句在默认状态下会比较引 ...
- C++运算符重载
C++运算符重载 基本知识 重载的运算符是具有特殊名字的函数,他们的名字由关键字operator和其后要定义的运算符号共同组成. 运算符可以重载为成员函数和非成员函数.当一个重载的运算符是成员函数时, ...
- c/c++面试题(6)运算符重载详解
1.操作符函数: 在特定条件下,编译器有能力把一个由操作数和操作符共同组成的表达式,解释为对 一个全局或成员函数的调用,该全局或成员函数被称为操作符函数.该全局或成员函数 被称为操作符函数.通过定义操 ...
- C++运算符重载详解
1.什么是运算符重载 运算符重载是一种函数重载. 运算符函数的格式:operatorop(argument-list)例如,operator+()重载+运算符.其中的op,必须是有效的C++运算符,如 ...
- C++中的运算符重载注意事项
1.C++中的运算符重载的方式有三种: a.类成员函数重载 b.友元函数重载 c.普通函数重载 注意: a.我们主要使用的方式主要是用:类成员函数和友元函数来实现运算符的重载. b.其实用普通函数理论 ...
随机推荐
- org.apache.spark.rpc.RpcTimeout$$anonfun$1.applyOrElse
跑sparkPis示例程序 [root@node01 bin]# ./spark-submit --master spark://node01:7077 --class org.apache.spar ...
- Vue 增删改查 demo
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- HTML 中的预留字符(如标签的小于号 < )必须被替换为字符实体( < )。 不间断空格( )
1. 参考 HTML 字符实体 Python处理HTML转义字符 比方说一个从网页中抓到的字符串 html = '<abc>' 用Python可以这样处理: import HTMLPars ...
- sklearn交叉验证3-【老鱼学sklearn】
在上一个博文中,我们用learning_curve函数来确定应该拥有多少的训练集能够达到效果,就像一个人进行学习时需要做多少题目就能拥有较好的考试成绩了. 本次我们来看下如何调整学习中的参数,类似一个 ...
- SQL反模式学习笔记16 使用随机数排序
目标:随机排序,使用高效的SQL语句查询获取随机数据样本. 反模式:使用RAND()随机函数 SELECT * FROM Employees AS e ORDER BY RAND() Limit 1 ...
- Django----admin模块初识
步骤1:创建管理员用户:在Terminal输入:pythonmanage.py createsuperuser 如下图所示说明创建成功 步骤二:运行项目文件:python manage.py runs ...
- js隐藏元素、jquery隐藏、css隐藏
$("#yh").css("display","none");//隐藏元素 $("#yh").css("dis ...
- Android 常用知识点
1.Kotlin 将字节大小转换为KB,MB,GB 并保留两位小数 fun getFileSize(size: Long): String { var GB = 1024 * 1024 * 1024 ...
- NEO GUI 多方签名使用
众所周至,NEOGUI是一个开发者演示用钱包,使用体验是非常的不友好的. 今天本来打算使用多方签名账户,发现和想象的不一样,请教了小伙伴也不行.遂调试了一下原因,发现踩进坑里了. 把这个问题记 ...
- 2017-11-4—LTspice
LTspice这个软件基本上上手就能用,没什么好说的. ADI的一些器件下载的spice文件可能是.cir的需要使用cadence的pspice软件打开后另存为.dir文件使用.(比如ad4096) ...
