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
代码解释: 此处我们声明了一个类,此时写了四个方法,第一个是初始化了我们的密码,第而个是和上面一样的声明了@property属性,第二个是setter, 第三个是deleter 方法。
此处我们要说的是getter方法,我们下面写的
1 2 xiaoming = user_account() xiaoming.password
就是一个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" 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 xiaoming.password = "123456abc" print (xiaoming.password) del xiaoming.passwordprint (xiaoming.password) """ 如果您是首次访问系统,初始密码是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.在设计类的接口时,要仔细考虑哪些数据应该暴露为属性,哪些应该保持私有。
那么,各位同学你掌握了吗?