python封装与property装饰器
1、封装的概念
1)封装(Encapsulation)
隐藏:属性和实现细节,不允许外部直接访问
暴露:公开方法,实现对内部信息的操作和访问
2、封装的作用
1)限制安全的访问和操作,提高数据安全性
2)可进行数据检查,从而有利于保证对象信息的完整性
3、封装的实现:隐藏
1)保护属性:_属性名
2)私有属性:__属性名
被视作 _类名__属性名
class Account:
# 普通属性
bank = "BOC"
# 内部属性
_username = "Hogwarts"
# 私有属性
__password = "888"
# 通过类名访问类属性
print(Account.bank) # 将会打印 BOC
print(Account._username) # 将会打印 Hogwarts
print(Account.__password) # 将会引发 AttributeError
print(Account.__dict__)
# 实例化
obj = Account()
# 实例访问类属性
print(obj.bank) # 将会打印 BOC
print(obj._username) # 将会打印 Hogwarts
print(obj.__username) # 将会引发AttributeError
4、封装的实现:暴露
1)提供数据访问功能(getter)
* 计算属性
* 语法:使用@property装饰器
* 调用:实例.方法名
class Account:
# 普通属性
bank = "BOC"
# 内部属性
_username = "Hogwarts"
# 私有属性
__password = "888"
@property
def password(self):
return self.__password
# 实例化对象
obj = Account()
# 访问实例的私有属性
print(obj.password) # 将会打印 888
2)提供数据操作功能(setter)
* 语法:使用@计算属性名.setter装饰器
* 调用:实例.方法名
class Account:
# 普通属性
bank = "BOC"
# 内部属性
_username = "Hogwarts"
# 私有属性
__password = "888"
@property
def password(self):
return self.__password
@password.setter
def password(self, value):
# 增加数据的校验
if len(value) >= 8:
self.__password = value
else:
print("密码长度最少要有8位!")
# 实例化对象
obj = Account()
# 修改私有属性(满足校验条件)
obj.password = "hogwarts666" # 修改成功
print(obj.password) # 将会打印 hogwarts666
# 修改私有属性(不满足校验条件)
obj.password = "123" # 修改不会生效
print(obj.password) # 将会打印 888