专栏首页python3Python包装授权

Python包装授权

    1、什么是包装

# -*- coding : utf-8 -*-
"""
    包装类,就是给被包装的类加个壳;被包装内实现壳的内部,而包装内提供壳的外部(接口),有点类似于继承关系,
    不过也不完全时,因为通过继承也可以实现包装效果,不使用继承同样可以实现包装效果。下面通过一个例子来展示
    包装的概念
"""

class PackageList(object):
    "包装List类型,使用非继承实现"

    def __init__(self):
        "构造方法,建立一个内部list对象"
        self.innerList = []

    def add(self, element):
        "添加一个元素"
        self.innerList.append(element)

    def remove(self, element):
        "删除一个元素"
        self.innerList.remove(element)

    def extend(self, elements):
        "扩展一个元素或者一个列表"
        if isinstance(elements, list):
            self.innerList.extend(elements)
        else:
            self.innerList.append(elements)

    def get(self, start = 0, end = -1, step = 1):
        "获取列表,或者某个元素,或者某个区域的元素"
        if isinstance(start, int) and isinstance(end, int) and isinstance(step, int):
            if end == -1:
                return self.innerList[start::step]
            else:
                return self.innerList[start : end : step]

        else:
            raise TypeError

if __name__ == "__main__":
    packageList = PackageList()
    # 添加一个元素
    packageList.add(1)
    # 添加一个序列
    packageList.extend([2, 3, 4])
    # 删除一个元素
    packageList.remove(3)
    # 获取列表
    print(packageList.get())

    2、什么是授权

# -*- coding : utf-8 -*-

"""
    授权:通俗点讲就是谁给谁权利,拥有权利的一方(授权方),授予给没有权利的一方(被授权方)。
    那么python是通过什么来获取权利,或者说是如何接受授权;关键是使用__getattr__内建函数,
    在python中,使用一个属性时,先到局部搜索,然后到类搜索,最后调用__getattr__函数,由于
    这一点,我们可以通过这个函数去获取某个对象的权限(属性)。
    注:
        属性:变量和方法
"""

class FileAuthorization(object):
    "实现文件对象授权"

    # obj : 授权方
    def __init__(self, obj):
        self.__data = obj

    # 重写__getattr__
    def __getattr__(self, attr):
        "使用内建getattr获取某个对象的属性,当python解析器在类实例和类中都没有搜索到属性时,调用"
        return getattr(self.__data, attr)

if __name__ == "__main__":
    file = FileAuthorization(open("./data.txt", 'w'))
    file.writelines(["test1\n", "test2\n"])
    file.flush()
    file.close()

    3、总结:

    包装和授权往往使用在定制某种类,其实现的多样性,只要你能想的到,就可以出现千变万化的授权、包装实现方式,上述仅仅提供参考。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 3 之 运算符重载详解

    实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。...

    py3study
  • 用 Python 实现的线程池

    为了提高程序的效率,经常要用到多线程,尤其是IO等需要等待外部响应的部分。线程的创建、销毁和调度本身是有代价的,如果一个线程的任务相对简单,那这些时间和空间开销...

    py3study
  • python 线程池学习

       def __init__( self, workQueue, resultQueue, timeout = 0, **kwds):

    py3study
  • 8.python3实用编程技巧进阶(三)

    zhang_derek
  • Python 3 之 运算符重载详解

    实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。...

    py3study
  • CNN预测股票走势基于Tensorflow(思路+程序)

    前言 我们希望找出跟随价格上涨的模式。通过每日收盘价,MA,KD,RSI,yearAvgPrice 本次推文研究只是展示深入学习的一个例子。 结果估计不是很好。...

    量化投资与机器学习微信公众号
  • 用 Python 实现的线程池

    为了提高程序的效率,经常要用到多线程,尤其是IO等需要等待外部响应的部分。线程的创建、销毁和调度本身是有代价的,如果一个线程的任务相对简单,那这些时间和空间开销...

    py3study
  • python 线程池学习

       def __init__( self, workQueue, resultQueue, timeout = 0, **kwds):

    py3study
  • Python开发植物大战僵尸游戏,详细教程

    一墨编程学习
  • Objectiv-c - UICollectionViewLayout自定义布局-瀑布流Demo地址

    公开变量以及代理. 公开的变量是可以进行调用时设置,一般就为这些,delegate用来实现动态的高度设置

    gwk_iOS

扫码关注云+社区

领取腾讯云代金券