面对对象之封装

Python面向对象之封装

【一】什么是封装,为什么要封装

  • 封装就是指,把数据与功能都整合到一起

    • 就是将某些地方隐藏起来,在程序外部看不到,其他程序无法调用

  • 封装最主要的原因就是为了保护隐私,将不想让用户看到的功能隐藏起来

  • 封装的方法就是在变量名前面加 __

【二】封装隐藏属性

class Person:
    __NAME = "knight"
​
    def __init__(self):
        # 变形为self._Person__age
        self.__age = 22
​
    # 定义函数时,会检测函数语法,所以__开头的属性也会变形
    # 变形为_Foo__run
    def __run(self):
        print('__f1 run')
​
    # 定义函数时,会检测函数语法,所以__开头的属性也会变形
    def walk(self):
        # 变形为self._Person__run
        self.__run()
​
print(Person.N)
#AttributeError: type object 'Person' has no attribute 'N'
obj = Person()
# print(obj.__x)
# AttributeError: 'Person' object has no attribute '__x'
# 数据属性
person = Person()
print(person._Person__NAME)     # 添加上person._Person 才能找到
# kinght
​
# 函数属性
class Person:
    # 在变量名前面加 __ : 在类初始化对象的时候会对当前变量名进行变形 变形成 _Person__变量名
    __SCHOOL_NAME = '清华'
​
    def __init__(self, name):
        self.name = name
​
    # 函数属性 : 在类初始化对象的时候会对当前变量名进行变形 变形成 _Person__变量名
    def __change_name(self):
        self.name = 'nb_' + self.name
​
​
student = Person(name='dream')
​
print(student.name)
# 查看类的民称空间
# {'_Person__SCHOOL_NAME': '清华','_Person__change_name': <function Person.__change_name at 0x000001D09384C0D0>,}
print(Person.__dict__)
​
print(student.__change_name())
​
# 当我们在对象中调用相关属性的时候会发现,找不到
  • 补充

# 变形只发生在类初始化得到对象的时候
# 并且变形只会发生一次
print(student.name)     # dream
print(Person.__dict__)      # {'__module__': '__main__', '_Person__SCHOOL_NAME': '清华',
student.__SCHOOL_NAME = '北大'
print(student._Person__SCHOOL_NAME) # 清华
print(Person.__dict__)      # {'__module__': '__main__', '_Person__SCHOOL_NAME': '清华',
print(student.__dict__)     # {'name': 'dream', '__SCHOOL_NAME': '北大'}
print(student.__SCHOOL_NAME)    # 北大

【三】什么是开放接口

  • 定义属性,并且隐藏属性或者方法是为了不然以后看到对应的功能和逻辑

  • 但是要给用户提供修改的接口

class Teacher:
    def __init__(self,name,age):
        self.__name = name
        self.__age = age
​
    def set_info(self,name,age):
        # 修改名字和修改年龄之前要校验当前格式是否正确
        # 名字前面必须 + lj_
        if not name.startswith('lj_'):
            raise ValueError('垃圾呢?')
        # 年龄必须是数字且大于0
        if not age.isdigit():
            raise ValueError('年龄是数字')
        if int(age) < 0 :
            raise ValueError('还没出生?')
        self.__name = name
        self.__age = age
​
    # 做一个接口查看当前讲师的个人信息
    def tell_info(self):
        print(f"当前讲师是:{self.__name},年龄是:{self.__age}")
​
​
teacher = Teacher(name='knight',age=20)
# 修改当前姓名和年龄
teacher.set_info(name='lj_gdy',age='21')
teacher.tell_info()

【四】小结

  • 隐藏属性和开发接口本质上都是为了明确的区分内外,在类内部可以随意修改代码,但是在类外部不允许使用者修改代码

  • 类外部只需要拿到一个接口,只要接口名不变,里面的逻辑可以随意实现

  • 只要接口基础不变,代码可以任意修改

【五】什么是property

  • 是一种特殊的属性,将函数的返回值作为数据属性返回

class Student:
    def __init__(self,name):
        self.name = name
​
    @property       
    def vip_name(self):
        return self.name
​
​
student = Student(name='knight')
print(student.name)     # knight
print(student.vip_name) # knight
# 没有property 的话函数就会输出 <bound method Student.vip_name of <__main__.Student object at 0x000001962556BA60>>

例:

class BMI:
    def __init__(self,name,weight,height):      # __init__就等于是BMI
        self.name = name
        self.weight = weight
        self.height = height
​
    @property
    def bmi(self):
        return self.weight / (self.height ** 2)
knight = BMI(name='knight',weight=63,height=165)
print(knight.bmi)   # 0.0023140495867768596
  • 为什么要使用property

(1)在所有编程语言中都有三种封装方式

public: 公开

protected:对外不公开但是对内公开

private:对谁都不公开

(2)上面三种封装方式就用到了我们的类中

class PersonOne(object):
    def __init__(self,name):
        self.name = name
person_one = PersonOne(name='knight')
print(person_one.name)      # 查看
person_one.name = '666'     # 修改
print(person_one.name)
del person_one.name         # 删除
print(person_one.name)
  • 使用装饰器property

class Person(object):
    def __init__(self,name):
        self.__name = name
    # 给当前函数名添加装饰器 property
    # 将当前 函数名作为一个数据属性返回
    @property
    def vip_name(self):
        # 返回值可以是字符串也可以是其他内容
        return self.__name
    #修改,函数名一致,后面加.setter
    @vip_name.setter
    def vip_name(self,value):
        # print(value)
        self.__name = value
​
        
    # 删除,函数名不变,后面加.deleter
    # 删除当前变量名的时候会触发
    @vip_name.deleter
    def vip_name(self):
        del self.__name
​
# 查看
person =Person(name='knight')
print(person.vip_name)
# 修改
person.vip_name = 'hyt'
print(person.vip_name)
# 删除
del person.vip_name
print(person.vip_name)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/596098.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA学习14——异常

目录 异常&#xff1a; 1.异常基本介绍&#xff1a; 2.异常体系图&#xff1a; 3.五大运行时异常&#xff1a; &#xff08;1&#xff09;NullPointerException空指针异常&#xff1a; &#xff08;2&#xff09;AirthmetiException数字运算异常&#xff1a; &#xff0…

翻译《The Old New Thing》 - Thread messages are eaten by modal loops

Raymond Chen 2005年4月26日 模态消息循环吃掉了线程消息 简要 文章提出了一个常见但也容易被忽视的问题&#xff1a; 线程消息&#xff08;由 PostThreadMessage 创建&#xff09;在模态循环中会被 DispatchMessage 丢弃&#xff0c;因为它们没有关联的窗口句柄。建议在创建窗…

2024年好用的几款数据库管理工具

本文主要介绍几款市面上好用的几款支持多种数据库、跨平台的数据库管理工具&#xff0c;包括开源/免费/收费不同的形式。 1. Chat2DB Chat2DB 是一款自2022年9月起开源的AI驱动的数据库管理工具&#xff0c;现如今已经超过了13k的Star。由EasyExcel&#xff08;31K Star&#…

Linux网络编程---Libevent库

一、简介 Libevent库的特点&#xff1a;开源。精简。跨平台&#xff08;Windows、Linux、maxos、unix&#xff09;。专注于网络通信。 二、安装 进入官网下载安装包后拖入虚拟机&#xff0c;压缩包名为 libevent-2.1.11-stable.tar.gz解压&#xff1a;使用命令tar -zxvf libe…

Sy9-dhcp/dns服务配置

前言、 课程需要&#xff08;进入服务器综合配置使用阶段了&#xff09;&#xff0c;这里还是沿用桌面版的ubuntu来配置dhcp和dns&#xff0c;这里updated了新的版本。2024.5 server端环境&#xff1a; Win11VMS&#xff1a;192.168.105.1192.168.105.128 &#xff08;ubuntu…

SEED-X:多模态智能助手

SEED-X&#xff1a;多模态智能助手 SEED-X 是一个多模态智能助手&#xff0c;已经将所有的模型和代码开源了&#xff01;它是一个统一且多用途的多模态基础模型&#xff0c;最新开放了图像编辑模型。 相较于传统的多模态交互框架&#xff0c;SEED-X 具有以下优点&#xff1a;…

OpenHarmony实战开发-如何使用Web组件加载页面

页面加载是Web组件的基本功能。根据页面加载数据来源可以分为三种常用场景&#xff0c;包括加载网络页面、加载本地页面、加载HTML格式的富文本数据。 页面加载过程中&#xff0c;若涉及网络资源获取&#xff0c;需要配置ohos.permission.INTERNET网络访问权限。 加载网络页面…

bugku-mathEnglish

拿到题目得到一串数学题&#xff0c;解出答案得 发现答案全都是1-5的数字&#xff0c;联想到英语中的元音密码解码字典 参照表中字母和前面解出的对应数字&#xff0c;得到flagyuanyinpwd&#xff0c;按格式提交解出题目答案

大模型_基于医疗领域用lora微调ChatDoctor模型

文章目录 ChatDoctor目标方法结果结论收集和准备医患对话数据集创建外部知识数据库具有知识大脑的自主聊天医生的开发模型培训结果数据和模型&#xff1a; 微调推理 ChatDoctor 目标 这项研究的主要目的是通过创建一个在医学建议中具有更高准确性的专业语言模型&#xff0c;来…

创新指南|非凡时代的变革型领导力——五个领导力差异化优势将使高管能够重塑他们的组织

大多数商界领袖现在都明白&#xff0c;我们正在经历一场“伟大的重构”&#xff0c;整个行业、经济和社会都在重塑的时期。然而&#xff0c;考虑到他们面临的短期压力&#xff0c;很少有高管发现自己能够真正应对这些变化&#xff0c;这些变化对他们的组织所需的转型意味着什么…

【Mac】 DSync for mac(文件比较同步工具) v2.7安装教程

软件介绍 DSync是一款文件比较同步工具&#xff0c;通过简便的三步即可完成繁琐的比较、同步操作&#xff0c;您甚至可以通过跳过、删除或反转您选择的文件的复制方向来微调您的同步。这是在Mac上同步文件的最简单方法。 安装教程 1.打开安装包&#xff0c;将「DSync」拖到右…

Merck:mPAGE® Lux SDS-PAGE制胶系统

相对于传统SDS-PAGE制胶工艺&#xff0c;Merck公司的mPAGE Lux制胶系统是一种更快速、简单、安全的替代方法&#xff0c;可实现更具可重现性的结果。mPAGE Lux制胶系统可在90秒内完成小型凝胶固化&#xff0c;而传统方法则需要90分钟以上。该系统采用紫外线照射快速制胶工作流程…

打破 AI 算力天花板,Meta超大规模AI基础设施架构解读

Meta超大规模AI智算基础设施架构设计 摘要 双重 GPU 集群&#xff0c;每群配备 2.4 万个 H100 芯片&#xff0c;分别采用 RoCE 和 InfiniBand 网络连接。LLaMA3 就是在这两个集群上训练出来的&#xff1b;Meta AI 将部署庞大算力集群&#xff0c;拥有 35 万张 H100 GPU&#x…

【字符串】Leetcode 43. 字符串相乘

题目讲解 43. 字符串相乘 算法讲解 class Solution { public:void AddZero(string& temp, int cnt) {while (cnt--) {temp 0;} }string Add(string num1, string num2) {string result;int carry 0;int i num1.size() - 1;int j num2.size() - 1;while (i > 0 ||…

Python学习笔记------处理数据和生成折线图

给定数据&#xff1a; jsonp_1629344292311_69436({"status":0,"msg":"success","data":[{"name":"美国","trend":{"updateDate":["2.22","2.23","2.24",&qu…

select,poll,epoll

在 Linux Socket 服务器短编程时&#xff0c;为了处理大量客户的连接请求&#xff0c;需要使用非阻塞I/O和复用&#xff0c;select&#xff0c;poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…

Vue-router使用(配置路径、路由跳转、相关API、多级路由、路由守卫,两种工作模式)

Vue-router使用(配置路径、路由跳转、相关API、多级路由、路由守卫&#xff0c;两种工作模式) 目录 Vue-router使用(配置路径、路由跳转、相关API、多级路由、路由守卫&#xff0c;两种工作模式)安装配置路径路由跳转不携带参数跳转携带参数跳转?形式携带参数地址中直接携带参…

如何设置ddns动态域名服务实现外网访问

在本地搭建好服务器&#xff0c;部署好web网站或其他应用后&#xff0c;需要在外网访问内网时&#xff0c;如何设置动态域名服务ddns&#xff0c;将主机的内网IP端口映射到外网访问&#xff0c;是我们需要面对的一个重要步骤。 内网发布外网&#xff0c;常见的有两种方案&…

KAN:Kolmogorov–Arnold Networks

KAN: Kolmogorov–Arnold Networks 论文链接&#xff1a;https://arxiv.org/abs/2404.19756 代码链接&#xff1a;https://github.com/KindXiaoming/pykan 项目链接&#xff1a;https://kindxiaoming.github.io/pykan/intro.html Abstract 受Kolmogorov-Arnold表示定理的启…

FX95GT FX505GT windows 11 触摸板安装

FX95GT FX505GT windows 11 触摸板驱动安装 如果正常使用 exe 文件安装不上&#xff0c;请在 ‘设置’ 》 ‘系统信息 ’》 驱动下载地址 如果正常使用 exe 文件安装不上&#xff0c;请在 ‘设置’ 》 ‘系统信息 ’》 高级系统设置 设备管理 在电脑上点右键&#xff0c;选择…
最新文章