简单的Python描述符

Python描述符

描述符

在接触描述符前先考虑一些问题

现在我们需要写一个类,用来创建账号和密码

class User:
    def __init__(self,name,password):
        self.name = name
        self.password = password
        

当我们创建了一个账号时,会发现这个账号没有一点安全性可言。完成可以随意的改变名字或者密码,这样的结果当然不是我们想要的。于是,我们就想有没有一个东西可以控制名字和账号的修改。于是乎,就有了描述符。

首先,说一下描述符的概念,就是如果 一个类 实现了get set delete 方法中的任意一个或多个就是一个描述符。然后,看一下具体案例。

class Descriptor:
    def __set__(self, instance, value):
        pass
    
    def __get__(self, instance, owner):
        pass
    
    def __delete__(self, instance):
        pass
    

这就是一个描述符类,当然你可以只写其中的一个方法。

接下来我们说一下描述符的使用方法。

class Descriptor:
    def __set__(self, instance, value):
        print('这里调用了set方法')

    def __get__(self, instance, owner):
        print('这里调用了get方法')

     def __delete__(self, instance):
        print('这里调用的del方法')



class User:
    def __init__(self, name, password):
        self.name = name    
        self.password = password 

接下来我们把用户类给使用描述符

class Descriptor:

    def __set__(self, instance, value):
        print('这里调用了set方法')

    def __get__(self, instance, owner):
        print('这里调用了get方法')
        
    def __delete__(self, instance):
        print('这里调用的del方法')


class User:
	name = Descriptor() # 看这里
	password = Descriptor()  # 看这里


这里其实就是把对象属性变成了一个描述符对象,如果此时我们调用对象属性会发生什么呢?执行下面的

u = User()

u.name  # 获取值

u.name = '小猪'  # 赋值

del u.name

在这里插入图片描述
看到这里应该是一些疑问和一下理解,首先看一下 运行结果。当我们获取对象属性的值的时候,如果则这个对象属性是一个描述符对象,那么。实际上是走了描述符类的get方法,那么set 和 delete,就是一样的。

然后发现我在使用描述符的时候,把实例属性换成了类属性。这是为什么呢?
这就是描述符的调用方法。目前我也没搞清楚,哈哈哈哈等我搞明白了在来改。。。。。

然后我们还发现就是在描述符类的方法中有很多的参数,我们可以使用print方法来看一下,这些参数代表这什么。

class Descriptor:

    def __set__(self, instance, value):
        print('instance ----', instance)
        print('value-----', value)
        print('这里调用了set方法')

    def __get__(self, instance, owner):
        print('instance ---', instance)
        print('owner---', owner)
        print('这里调用了get方法')

    def __delete__(self, instance):
        print('这里调用了delete方法')


class User:
    name = Descriptor()
    password = Descriptor()


u = User()

u.name

u.name = '小猪'

在这里插入图片描述
也就是 instance 代表这 调用这个描述符的 对象
owner 代表 这里对象的类
value 代表要修改的值。

然后

回到我们一开始的问题,那么方法显而易见。

class Descriptor:
    def __init__(self):
        self.data = None
        self.key = '123456'

    def __set__(self, instance, value):
        xkey = input('请输入密匙:')
        if xkey == self.key:
            print('修改成功')
            self.data = value

    def __get__(self, instance, owner):
        xkey = input('请输入密匙:')
        if xkey == self.key:
            return self.data


class User:
    name = Descriptor()
    password = Descriptor()

这样一来,我们需要修改账号或者密码的时候,就不能直接修改了。

这些知识都不难,也许我的思路有错误的地方,欢迎各位大佬指正。

然后
纸上得来终觉浅 绝知此事要躬行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值