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. RabbitMQ基础知识及Linux安装

    RabbitMQ: RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现. AMQP协议: AMQP,即Advanced Message Qu ...

  2. POI导出数据以Excel的方式录入,下载

    简单描述:把数据导出到excel文件中.过程:获取要导出的数据列表(list),创建excel文件,数据放入. 代码: //html代码 <div class="btn-group&q ...

  3. mac os安装shell man中文帮助工具(manpages-zh),即man命令显示中文帮助文档

    一.从官网(http://pkgs.fedoraproject.org/repo/pkgs/man-pages-zh-CN)下载安装包:或者从开源代码(https://github.com/man-p ...

  4. CSS之文本

    文本对齐方式 text-align left 把文本排列到左边. 默认值:由浏览器决定. right 把文本排列到右边. center 把文本排列到中间. justify 实现两端对齐文本效果. in ...

  5. Java 常用知识点

    Java 常用知识点 1.日期格式化 SimpleDateFormat Date date=new Date(System.currentTimeMillis()) ; SimpleDateForma ...

  6. 在Node.js中使用ffi调用dll

    类似的文章还是比较多的,但或多或少有一些问题没有解决,在此我将其整合并分享给大家: 测试环境: Node.js 9.9.0 VisualStudio 2015 "ffi": &qu ...

  7. SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  8. ZooKeeper Getting Started Guide

    http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html What is ZooKeeper? ZooKeeper is a centra ...

  9. 20181115 python-第一章学习小结part1

    知识点回顾: 什么是编程: 写代码,让计算机执行任务 编程语言的分类与特性: 1.机器语言,即二进制语言,最帖近于机器底层,可以由计算机直接执行,故速度最快,但不适合开发. 2.汇编语言,直接将二进制 ...

  10. python ironicclient源码分析

    ironicclient是一个cli工具,用来和用户交互的. 首先写一个简单的例子,获取ironic所有的node节点: from ironicclient import client if __na ...