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()
这样一来,我们需要修改账号或者密码的时候,就不能直接修改了。
这些知识都不难,也许我的思路有错误的地方,欢迎各位大佬指正。
然后
纸上得来终觉浅 绝知此事要躬行