ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-02-15 20:34:59  阅读:134  来源: 互联网

标签:02 __ 06 name country self 面向对象 Student 属性


一、隐藏属性

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  # 删

 

标签:02,__,06,name,country,self,面向对象,Student,属性
来源: https://www.cnblogs.com/erfeier/p/15897355.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有