06_02、面向对象的特征一:封装

一、隐藏属性

1、为什么要隐藏属性

 定义属性就是为了使用,所以隐藏并不是目的,隐藏属性的目的在于限制类外部对数据的直接操作

然后类内应该提供相应的接口来允许类外部间接地操作数据

接口之上可以附加额外的逻辑来对数据的操作进行严格地控制

这就是隐藏属性和开放接口的意义

2、如何隐藏属性

Python的Class机制采用双下划线开头的方式将属性隐藏起来,

类属性、对象属性、方法属性都可以隐藏

类中所有双下滑线开头的属性都会在类定义阶段、检测语法时自动变成“_类名__属性名”的形式

隐藏属性对外不对内(对外隐藏,对内不隐藏)

可以通过类属性查看:  类名.__dict__

# 隐藏属性
class Student():
    # 隐藏类属性
    __country = 'CHINA'  # _Student__country

    def __init__(self, name, age):
        # 隐藏对象属性
        self.__name = name # _Student__name
        self.age = age
    
    # 隐藏方法属性
    def __func(self): # _Student__func
        print('from func')
print(Student.__dict__)

二、开放接口

# 开放接口,返回类内部的隐藏属性值,并且可以增加限制

class Student():  # 学生类
    __country = 'CHINA'  # 类属性

    # 初始化方法,自定义对象属性
    def __init__(self, name, age):
        # 隐藏对象属性
        self.__name = name # _Student__name
        self.age = age

    # 隐藏方法属性
    def __func(self): # _Student__func
        print('from func')

    # 开放接口,返回隐藏的类的属性值
    def get_country(self):
        return self.__country  # self._Student__country

    # 增设限制
    def set_country(self, v):
        if not type(v) is str:
            print('不是str')
            return
        self.__country = v


print(Student.__dict__)

三、property装饰器

Python专门提供的一个装饰器property,可以将类中的函数“伪装成”对象的数据属性

对象在访问该特殊属性时会触发功能的执行,然后将返回值作为本次访问的结果

使用property有效地保证了属性 访问 的一致性,另外property还提供 设置 和 删除 属性的功能

 

# property 装饰器
class Student():
    # 隐藏类属性
    __country = 'CHINA' 

    # 自定义对象属性
    def __init__(self, name, age):
        # 隐藏对象属性
        self.__name = name # _Student__name
        self.age = age

    # 隐藏方法属性
    def __func(self): # 可以通过_Student__func调用
        print('from func')

    # 通过@property把函数伪装成属性
    # 该特殊属性作为接口,返回了原来的隐藏属性的值
    @property
    def country(self):
        return self.__country  # 可以通过self._Student__country查看

    # property提供的设置功能(改的操作)
    @country.setter
    def country(self, v):
        if not type(v) is str:
            return
        self.__country = v

    # property提供的删除属性
    @country.deleter
    def country(self):
        del self.__country
        
 stu = Student('tom', 18)  # 实例化,产生stu对象

print(stu.country)  # 通过 对象名.特殊属性名 调用

stu.country = 'xxx'  # 修改属性值
# print(stu.country)

del stu.country  # 删除属性值

 补充:property的第二种使用方法

class Student():
    __country = 'CHINA'  

    def __init__(self, name, age):
        self.__name = name # _Student__name
        self.age = age

    def __func(self): # _Student__func
        print('from func')


    def get_country(self):
        return self.__country  # self._Student__country

    def set_country(self, v):
        if not type(v) is str:
            return
        self.__country = v

    def del_country(self):
        del self.__country

    country = property(get_country, set_country, del_country)
        
stu = Student('tom', 18)  # 查
stu.country = 'American'  # 改
del stu.del_country  # 删

 

上一篇:VScode 配置最新 git-bash 为默认终端


下一篇:【PAT (Basic Level) Practice】——【二分】1030 完美数列