Python的property属性

Python的property属性讲解

当我们在编程类的时候假如我们想做到一些限制,例如这个类型的不允许修改,虽然可以通过函数逻辑处理进行达到目的,但是我们可以通过python自带的property属性做到哦!

代码解释

假如我们要写一个关于金额的限制,这里首先限制关于假如我们的密码这里不允许更改,当然只是举例子,现实肯定是可以修改的!

1
2
3
4
5
6
7
class user_account:
@property
def password(self):
return "密码:123456"

xiaoming = user_account()
print(xiaoming.password)

代码解释: 运行上述代码 我们定义了一个user_account类,这个类里的一个password方法里面retrun 了一个字符串,假如此时运行程序我们会发现输出了密码:123456,下一步我们进行修改我们的password。

1
2
3
4
5
6
7
8
9
class user_account:
@property
def password(self):
return "密码:123456"

xiaoming = user_account()
print(xiaoming.password)
xiaoming.password = "密码:123456abcd"
print(xiaoming.password)

代码解释:此时我们想要将 密码:123456 改为 密码:123456abc。但是运行程序后报错了,报错如下:

1
2
3
4
5
ERROR!
密码:123456
Traceback (most recent call last):
File "<main.py>", line 8, in <module>
AttributeError: property 'password' of 'user_account' object has no setter

提示我们无法修改这个内存变量password,那么为什么呢?是因为我们如果使用了@property 属性此时这个变量就变成了只读的,不可以被修改,这样我们就做到了无法修改密码的要求,但是现实是需要修改的,我们又不想随意修改,那么我们可以引进新的概念!

setter、getter 和 deleter 方法

那么在这里我们有setter, getter, deleter方法,其中setter 是在@property属性里面可以进行修改, getter是获取, deleter是删除,可能各位同学听起来还是晕晕的,那么我们就直接进入正题代码解惑!

代码解释 getter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class user_account:
def __init__(self):
self._password = ‘初始密码 123456

@property
def password(self):
print("如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!")
return self._password

@password.setter
def password(self, value):
print("当前您正在进行修改密码的操作,请注意周围安全!")
self._password = value

@password.deleter
def password(self):
print("当前您正在进行删除密码的操作,请慎重!")
del self._password
print('del complite')


xiaoming = user_account()
xiaoming.password # 如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!

代码解释: 此处我们声明了一个类,此时写了四个方法,第一个是初始化了我们的密码,第而个是和上面一样的声明了@property属性,第二个是setter, 第三个是deleter 方法。

此处我们要说的是getter方法,我们下面写的

1
2
xiaoming = user_account()
xiaoming.password # getter 方法

就是一个getter方法用来获取我们的密码信息。

代码解释 setter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class user_account:
def __init__(self):
self._password = ‘初始密码 123456

@property
def password(self):
print("如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!")
return self._password

@password.setter
def password(self, value):
print("当前您正在进行修改密码的操作,请注意周围安全!")
self._password = value

@password.deleter
def password(self):
print("当前您正在进行删除密码的操作,请慎重!")
del self._password
print('del complite')


xiaoming = user_account()
xiaoming.password

xiaoming.password = "123456abc" # setter
print(xiaoming.password)

# 输出结果
"""
当前您正在进行修改密码的操作,请注意周围安全!
如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!
123456abc
"""

这里我们使用的就是setter方法,可以发现我们在最开始的无法修改密码,到现在可以修改成功了就是我们的setter方法实现的!

代码解释 deleter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
class user_account:
def __init__(self):
self._password = ‘初始密码 123456

@property
def password(self):
print("如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!")
return self._password

@password.setter
def password(self, value):
print("当前您正在进行修改密码的操作,请注意周围安全!")
self._password = value

@password.deleter
def password(self):
print("当前您正在进行删除密码的操作,请慎重!")
del self._password
print('删除密码成功!')


xiaoming = user_account()
xiaoming.password # getter 方法

xiaoming.password = "123456abc"
print(xiaoming.password) #setter 方法

del xiaoming.password
print(xiaoming.password) # deleter方法 出错 提示无当前变量信息因为已经删除

# 输出信息
"""
如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!
当前您正在进行修改密码的操作,请注意周围安全!
如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!
123456abc
当前您正在进行删除密码的操作,请慎重!
删除密码成功!
如果您是首次访问系统,初始密码是123456,请您及时修改您的密码,避免被盗!
ERROR!
Traceback (most recent call last):
File "<main.py>", line 29, in <module>
File "<main.py>", line 8, in password
AttributeError: 'user_account' object has no attribute '_password'
"""

那么上面就是deleter 方法,此时我们可以看到我们进行了删除密码的操作,这样的话我们就完成了所有的信息。

总结

由此可见使用属性的一些好处例如:

1.封装:属性提供了一种封装数据的方式,隐藏了数据实现的细节,只暴露访问和修改数据的接口。

2.验证:在设置属性值时,你可以执行验证逻辑,确保数据的有效性。

3.灵活性:属性的实现可以更改,而不需要更改使用这些属性的代码。

4.接口一致性:通过使用属性,你可以让类的接口看起来更像是数据访问,而不是方法调用,这对于不熟悉Python的开发者来说可能更直观。

但是,也是存在一些弊端问题例如:

1.虽然属性提供了一种强大的方式来控制数据的访问,但过度使用可能会使代码难以理解和维护。

2.在某些情况下,直接使用公有变量或私有变量加方法访问可能更为简单和直观。

3.在设计类的接口时,要仔细考虑哪些数据应该暴露为属性,哪些应该保持私有。

那么,各位同学你掌握了吗?


Python的property属性
https://dreamshao.github.io/2024/09/02/python的property属性/
作者
Yun Shao
发布于
2024年9月2日
许可协议