一、python 封装与property装饰器

# -*- coding: utf-8 -*-
# @Time    : 2023/4/21 22:16
# @Author  : yanfali
# @File    : p_1.py
# @Software: 封装 property

""""""
"""一、封装的概念
隐藏:属性和实现细节,不允许外部直接访问
暴露:公开方法,实现对内部信息的操作和访问"""

"""二、封装的作用
限制安全的访问和操作,提高数据安全性
可进行数据检查,从而有利于保证对象信息的完整性"""


class Accont:
    """账户"""

    # 普通属性
    bank = "boc"

    """三、封装的实现:隐藏
    保护属性:_属性名
    私有属性:__属性名 被视作_类名__属性名"""
    # 保护属性
    _username = "hogwarts"

    # 私有属性
    __password = "888"

    """四、封装的实现:暴露
    提供数据访问功能(getter)
    计算属性
    语法:使用@property装饰器、语法糖
    调用:实例.方法名"""

    # 暴露 -计算属性
    @property
    def password(self):
        return self.__password

    """五、封装的实现:暴露
    提供数据操作功能(setter)
    语法:使用@计算属性名.setter装饰器
    调用:实例.方法名
    """

    @password.setter
    def password(self, value):
        if len(value) >= 8:
            self.__password = value
        else:
            print("密码长度最少8位")


# print(Accont.bank)
# print(Accont._username) #会提示Access to a protected member _username of a class
# print(Accont.__password) #无法填充,AttributeError: type object 'Accont' has no attribute '__password'

# 打印有哪些属性
print(Accont.__dict__)  # 自动改名为_Accont__password

# 实例化对象
obj = Accont()
# 访问实例的私有属性
print(obj.password)  # 888

# 修改私有属性-满足校验条件
obj.password = "12345678"
print(obj.password)  # 12345678
# 修改私有属性-不满足校验条件
obj.password = "1234"
print(obj.password)  # 会自动过滤非法数据保留原数据。密码长度最少8位 \n 888