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

先看一段代码:
 1 class Scope():  # 定义一个基类,因为每个权限类都需要add()方法
 2     allow_api = []
 3
 4     def add(self, other):
 5         self.allow_api = self.allow_api + other.allow_api
 6         return self
 7
 8
 9 class UserScope(Scope):  # 普通用户权限
10     allow_api = ['权限A']
11
12
13 class AdminScope(Scope):  # 管理员权限(管理员权限=管理员权限+普通用户权限)
14     allow_api = ['权限B']
15
16     def __init__(self):
17         self.add(UserScope())
18
19
20 class SuperScope(Scope):  # 超级管理员(超级管理员权限=超级管理员权限+管理员权限+普通用户权限)
21     allow_api = ['权限C']
22
23     def __init__(self):
24         self.add(AdminScope())
25
26
27 u = UserScope()
28 a = AdminScope()
29 s = SuperScope()
30 print('普通用户  ',u.allow_api)
31 print('管理员    ',a.allow_api)
32 print('超级管理员',s.allow_api)

执行结果:
普通用户   ['权限A']
管理员     ['权限B', '权限A']
超级管理员 ['权限C', '权限B', '权限A']

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

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

 1 class Scope():  # 定义一个基类,因为每个权限类都需要add()方法
 2     allow_api = []
 3
 4     def __add__(self, other):
 5         self.allow_api = self.allow_api + other.allow_api
 6         return self
 7
 8
 9 class UserScope(Scope):  # 普通用户权限
10     allow_api = ['权限A']
11
12
13 class AdminScope(Scope):  # 管理员权限(管理员权限=管理员权限+普通用户权限)
14     allow_api = ['权限B']
15
16     def __init__(self):
17         self + UserScope()
18
19
20 class SuperScope(Scope):  # 超级管理员(超级管理员权限=超级管理员权限+管理员权限+普通用户权限)
21     allow_api = ['权限C']
22
23     def __init__(self):
24         self + AdminScope() + UserScope()
25
26
27 u = UserScope()
28 a = AdminScope()
29 s = SuperScope()
30 print('普通用户  ', u.allow_api)
31 print('管理员    ', a.allow_api)
32 print('超级管理员', s.allow_api)

执行结果:

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

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

 1 class Scope():  # 定义一个基类,因为每个权限类都需要add()方法
 2     allow_api = []
 3
 4     def __add__(self, other):
 5         self.allow_api = list(set(self.allow_api + other.allow_api))
 6         return self
 7
 8
 9 class UserScope(Scope):  # 普通用户权限
10     allow_api = ['权限A']
11
12
13 class AdminScope(Scope):  # 管理员权限(管理员权限=管理员权限+普通用户权限)
14     allow_api = ['权限B']
15
16     def __init__(self):
17         self + UserScope()
18
19
20 class SuperScope(Scope):  # 超级管理员(超级管理员权限=超级管理员权限+管理员权限+普通用户权限)
21     allow_api = ['权限C']
22
23     def __init__(self):
24         self + AdminScope() + UserScope()
25
26
27 u = UserScope()
28 a = AdminScope()
29 s = SuperScope()
30 print('普通用户  ', u.allow_api)
31 print('管理员    ', a.allow_api)
32 print('超级管理员', s.allow_api)

执行结果:

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

总结:其实也就是在遇到“+”这个符号的时候,会调用__add__方法。   效果都是一样的,但是感觉这样才是真正用到python。。。

 

转载于:https://www.cnblogs.com/MisterZZL/p/9860585.html

__add__,关于运算符重载(用户权限)相关推荐

  1. 【黑马程序员 C++教程从0到1入门编程】【笔记4】C++核心编程(类和对象——封装、权限、对象的初始化和清理、构造函数、析构函数、深拷贝、浅拷贝、初始化列表、友元friend、运算符重载)

    黑马程序员C++教程 文章目录 4 类和对象(类属性[成员属性],类函数[成员函数]) 4.1 封装 4.1.1 封装的意义(三种权限:public公共.protected保护.private私有)( ...

  2. 编写一个程序,用户使用for循环输入5个数字,所有这些数字将存储在一个数组中。之后,程序将添加这五个数字并显示结果。程序必须支持运算符重载的概念。

    Write a program in which users enter 5 numbers using for loop and all these numbers will store in an ...

  3. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...

    如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 float 类型的区别: 你可能想知道同一内置运算符或函数如何对不同类对象进行不同操作的.这分别 ...

  4. python 运算符重载_零基础小白Python入门必看:面向对象之典型魔术方法

    魔术方法 查看类的魔术方法 class A: passdir(A) # 可以得到类所有公有成员复制代码 输出结果如下 ['__class__', '__delattr__', '__dict__', ...

  5. python次方运算_neg__python 魔术方法1 运算符重载

    python中存在一些特殊的方法,这些方法通常采用格式:__method__().这些方法会在特定的情况下自动调用.例如:__new__().__init__().__del__() 等生命周期方法. ...

  6. 【C++】C++类的学习(三)——运算符重载与友元函数

    [fishing-pan:https://blog.csdn.net/u013921430转载请注明出处] 前言 前面的两篇博文中介绍了类的一些基本特性,今天讲一讲运算符重载和友元. 运算符重载 运算 ...

  7. C++入门:构造函数,析构函数,拷贝构造函数,运算符重载详解

    目录 类的6个默认成员函数 一.构造函数 1.概念 2.特征如下: (1) 函数名与类名相同. (2)无返回值. (3)对象实例化时编译器自动调用对应的构造函数. (4)构造函数可以重载. (5)如果 ...

  8. C++基础之运算符重载

    前言 一.友元 二.运算符重载 三.特殊运算符重载 四.建议 前言 个人学习笔记 一.友元 一般来说,类的私有成员只能在类的内部访问,类之外是不能访问它们的.但如果将其他类或函数设置为类的友元(fri ...

  9. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

最新文章

  1. linux mysql 系统时间函数吗_linux下获取系统时间的方法
  2. 殊途同归的策略梯度与零阶优化
  3. socket服务器显示未响应,“程序未响应”的思考总结
  4. 鸡蛋学运维-2:Rsync同步配置步骤
  5. python怎么用for循环找出最大值_用for循环语句写一个在输入的十个数字中求最大和最小值的python程序应该怎么写?...
  6. Java工作笔记-IntelliJ IDEA中的精确搜索
  7. 2014-06-13 jq chart
  8. 【Java并发编程】—–“J.U.C”:ArrayBlockingQueue
  9. Archlinux桌面配置指南
  10. 十大物流仿真软件汇总
  11. 我的世界基岩版好还是java版好_我的世界:Java版本好玩还是基岩版好玩?老玩家看完后沉默了...
  12. 教你如何在word中像LaTex那样打公式
  13. 现金流中文版免CD提示补丁
  14. Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏
  15. 微信公众号编辑器图片上传后有白色背景
  16. 什么是大数据分析 主要应用于哪些行业?以制造业为例
  17. 直播:Phoenix 全局索引原理与实践
  18. Altera FPGA程序固化(软件+硬件)
  19. leetcode 字符串之单词
  20. Docker服务启动报错:Job for docker.service failed because the control process exited with error

热门文章

  1. Java基类Object中有哪些方法
  2. 转载:vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  3. 第五周项目三-时间类(1)
  4. CentOS 7.0系统安装配置图解教程
  5. java 打破双亲委派,为什么说java spi破坏双亲委派模型?
  6. Flutter开发之GridView组件(20)
  7. php微信开发例子,微信开发实战之知乎日报
  8. 字符串大小写转换通用函数
  9. codeforces626F
  10. django源码解析一(请求处理流程)