首页 > 其他分享 >描述符示例详解

描述符示例详解

时间:2023-04-08 21:36:28浏览次数:41  
标签:__ name 示例 self 描述符 详解 password transformation

代码

这里要创建一个描述符,根据要求(如隐藏敏感信息、正确地设置日期的格式)对属性的值进行变换,并返回修改后的版本:

from dataclasses import dataclass
from datetime import datetime
from functools import partial
from typing import Callable


class BaseFieldTransformation:

    def __init__(self, transformation: Callable[[], str]) -> None:
        print("初始化")
        self._name = None
        self.transformation = transformation

    def __get__(self, instance, owner):
        print("get执行")
        if instance is None:
            return self
        raw_value = instance.__dict__[self._name]
        return self.transformation(raw_value)

    def __set_name__(self, owner, name):
        print("set_name执行")
        self._name = name

    def __set__(self, instance, value):
        print("set执行")
        instance.__dict__[self._name] = value


ShowOriginal = partial(BaseFieldTransformation, transformation=lambda x: x)
HideField = partial(
    BaseFieldTransformation, transformation=lambda x: "**redacted**"
)
FormatTime = partial(
    BaseFieldTransformation,
    transformation=lambda ft: ft.strftime("%Y-%m-%d %H:%M"),
)


@dataclass
class LoginEvent:
    username: str = ShowOriginal()
    password: str = HideField()
    ip: str = ShowOriginal()
    timestamp: datetime = FormatTime()

    def serialize(self) -> dict:
        return {
            "username": self.username,
            "password": self.password,
            "ip": self.ip,
            "timestamp": self.timestamp,
        }


if __name__ == '__main__':
    le = LoginEvent("john", "secret password", "1.1.1.1", datetime.utcnow())

>>> le = LoginEvent("john", "secret password", "1.1.1.1", datetime.
utcnow())
>>> vars(le)
{'username': 'john', 'password': 'secret password', 'ip': '1.1.1.1',
'timestamp': ...}
>>> le.serialize()
{'username': 'john', 'password': '**redacted**', 'ip': '1.1.1.1',
'timestamp': '...'}
>>> le.password
'**redacted**'


这段代码使用了 Python 中的描述符(Descriptor)和数据类(Data Class)来实现一个 LoginEvent 类,该类用于表示用户的登录事件,并包含了一些敏感信息。其中,BaseFieldTransformation 类是一个基类,它定义了描述符的通用行为。LoginEvent 类继承了 dataclass 装饰器,这使得该类具有自动生成 init__、__repr 等方法的特性。

BaseFieldTransformation 描述符有三个方法:

__init__: 在对象创建时被调用,用于初始化对象状态;
__get__: 在属性被访问时被调用,用于获取属性的值;
__set__: 在属性被赋值时被调用,用于设置属性的值;
__set_name__: 在类中定义属性时被调用,用于设置描述符名称。
在该代码中,我们定义了三个具体的 BaseFieldTransformation 子类:ShowOriginal、HideField 和 FormatTime。这些子类通过 partial 函数将 transformation 参数预设为不同的函数,以便对应不同的字段转换方式。例如,ShowOriginal 字段保持原样,而 HideField 字段使用 "redacted" 来代替其真实值。

最后,我们使用 LoginEvent 类创建了一个数据记录。该数据记录用于存储用户的登录事件,包括用户名、密码、IP 地址和时间戳。其中,用户名和 IP 地址字段使用 ShowOriginal 描述符,这意味着它们不会被转换。密码字段使用 HideField 描述符,这意味着它将被替换为 "redacted"。时间戳字段使用 FormatTime 描述符,这意味着它将按照指定格式进行格式化。登录事件还包括一个 serialize 方法,用于将该事件序列化为 dict 格式的数据。



标签:__,name,示例,self,描述符,详解,password,transformation
From: https://www.cnblogs.com/weiweivip666/p/17299269.html

相关文章

  • JDBC-API详解--PreparedStatement
    PreparedStatement作用:1.预编译sql语句并执行:预防sql注入问题·sql注入sql注入是通过操作输入来修改事先定义好的sql语句,用以执行代码来对服务器进行攻击的方法写法: Stringsql="select*fromuserwhereusername=?andpassword=?";//注意参数要写成问号。Prep......
  • JDBC-API详解--ResultSet
    ResultSet作用:1.封装查询语句ResultSetexecuteQuery(sql):执行查询语句,返回ResultSet对象。·获取查询结果:booleannext();  1将光标从当前位置向前移动一行2判断当前行是否为有效行。返回值:true为有效行 false为无效行XXXgetXxx(参数)用于获取数据参数:可以是int......
  • JDBC-API详解--DriverManager
    DriverManager(驱动管理类)作用:1.注册驱动2.获取数据库连接参数:1.url:连接路径 语法:jdbc:mysql://ip地址(域名):端口号/数据库名称?参数键值对1......示例:jdbc:mysql://127.0.0.1:3306/db1;注:如果连接本机mysql服务器,且mysql服务器默认端口是3306,则url可以简......
  • JDBC-API详解--Connection
    Connection(数据库连接对象)作用:1.获取执行SQL的对象2.管理事务对于获取执行SQL的对象:·普通执行SQL对象:StatementcreateStatement();·预编译SQL的执行SQL对象(防止SQL注入):PreparedStatementprepareStatement(SQL);·执行存储过程的对象:CallableStatementprepareCall(SQL......
  • 自定义线程池详解
    自定义线程池ThreadPoolExecutorexecutor=newThreadPoolExecutor(5,10,200,TimeUnit.MILLISECONDS, newArrayBlockingQueue<Runnable>(5));第一个参数:核心线程池大小,默认创建后就不会销毁,需要设置allowCoreThreadTimeOut为true时会销毁第二个参数:线程池最大大......
  • Java-SPI机制详解
    Java之SPI机制详解1:SPI机制简介SPI全称是ServiceProviderInterface,是一种JDK内置的动态加载实现扩展点的机制,通过SPI技术我们可以动态获取接口的实现类,不用自己来创建。这个不是什么特别的技术,只是一种设计理念。2:SPI原理JavaSPI实际上是基于接口的编程+策略模......
  • 7个最新的时间序列分析库介绍和代码示例
    时间序列分析包括检查随着时间推移收集的数据点,目的是确定可以为未来预测提供信息的模式和趋势。我们已经介绍过很多个时间序列分析库了,但是随着时间推移,新的库和更新也在不断的出现,所以本文将分享8个目前比较常用的,用于处理时间序列问题的Python库。他们是tsfresh,autots,darts......
  • 4.简单示例提示
    笔记软件在2023/4/614:01:12推送该笔记简单示例提示如果出错的开始点和结束点在同一个位置,VSCode会在那个单词的位置上打上波浪线如果你想要把波浪线加到行未为止,就把endposition​设置为Number.MAX_VALUE​运行语言服务器步骤:通过快捷键(Ctrl+Shift+B)启动build任务。......
  • 【C】动态内存管理 malloc calloc relloc free 函数详解
    【C】动态内存管理@[toc]本章重点为什么存在动态内存分配动态内存函数的介绍mallocfreecallocrealloc常见的动态内存错误几个经典的笔试题1.为什么存在动态内存分配我们已经掌握的内存开辟方式有:#include<stdio.h>intmain(){ intnum=10;//向内存申请了4个字节的空间 int......
  • SQL Server STUFF() 函数详解
    STUFF():在SQLServer中,stuff()函数用于从源字符串中删除给定长度的字符序列,并从指定的起始索引插入给定的字符序列。用法:STUFF(source_string,start,length,change_string)source_string:字符数据start:指定删除和插入的开始位置length:指定要删除的字符数......