面对对象之封装

Python面向对象之封装

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

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

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

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

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

【二】封装隐藏属性

class Person:__NAME = "knight"
​def __init__(self):# 变形为self._Person__ageself.__age = 22
​# 定义函数时,会检测函数语法,所以__开头的属性也会变形# 变形为_Foo__rundef __run(self):print('__f1 run')
​# 定义函数时,会检测函数语法,所以__开头的属性也会变形def walk(self):# 变形为self._Person__runself.__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 = nameself.__age = age
​def set_info(self,name,age):# 修改名字和修改年龄之前要校验当前格式是否正确# 名字前面必须 + lj_if not name.startswith('lj_'):raise ValueError('垃圾呢?')# 年龄必须是数字且大于0if not age.isdigit():raise ValueError('年龄是数字')if int(age) < 0 :raise ValueError('还没出生?')self.__name = nameself.__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__就等于是BMIself.name = nameself.weight = weightself.height = height
​@propertydef 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# 将当前 函数名作为一个数据属性返回@propertydef vip_name(self):# 返回值可以是字符串也可以是其他内容return self.__name#修改,函数名一致,后面加.setter@vip_name.setterdef vip_name(self,value):# print(value)self.__name = value
​# 删除,函数名不变,后面加.deleter# 删除当前变量名的时候会触发@vip_name.deleterdef 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.mzph.cn/pingmian/7155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

esp32+mqtt协议+paltformio+vscode+微信小程序+温湿度检测

花费两天时间完成了这个项目&#xff08;不完全是&#xff0c;属于是在resnet模型训练和温湿度检测两头跑......模型跑不出来&#xff0c;又是第一次从头到尾独立玩硬件&#xff0c;属于是焦头烂额了......&#xff0c;完成这个项目后&#xff0c;我的第一反应是写个csdn&#…

[每日AI·0506]巴菲特谈 AI,李飞飞创业,苹果或将推出 AI 功能,ChatGPT 版搜索引擎

AI 资讯 苹果或将推出 AI 功能&#xff0c;随 iPhone 发布2024 年巴菲特股东大会&#xff0c;巴菲特将 AI 类比为核技术 巴菲特股东大会 5 万字实录消息称 OpenAI 将于 5 月 9 日发布 ChatGPT 版搜索引擎路透社消息&#xff0c;斯坦福大学 AI 领军人物李飞飞打造“空间智能”创…

切比雪夫滤波器

切比雪夫滤波器&#xff0c;也被称为车比雪夫滤波器&#xff0c;是一种在通带或阻带上频率响应幅度等波纹波动的滤波器。它基于切比雪夫多项式的理论&#xff0c;并且是以俄罗斯数学家巴夫尼提列波维其切比雪夫&#xff08;Пафнутий Лвович Чебышёв&#…

论文辅助笔记:Tempo 之 model.py

0 导入库 import math from dataclasses import dataclass, asdictimport torch import torch.nn as nnfrom src.modules.transformer import Block from src.modules.prompt import Prompt from src.modules.utils import (FlattenHead,PoolingHead,RevIN, )1TEMPOConfig 1.…

【C++】 认识多态 + 多态的构成条件详细讲解

前言 C 目录 1. 多态的概念2 多态的定义及实现2 .1 虚函数&#xff1a;2 .2 虚函数的重写&#xff1a;2 .2.1 虚函数重写的两个例外&#xff1a; 2 .3 多态的两个条件&#xff08;重点&#xff09;2 .4 析构函数为啥写成虚函数 3 新增的两个关键字3.1 final的使用&#xff1a;3…

09_电子设计教程基础篇(电阻)

文章目录 前言一、电阻原理二、电阻种类1.固定电阻1、材料工艺1、线绕电阻2、非线绕电阻1、实心电阻1、有机实心电阻2、无机实心电阻 2、薄膜电阻&#xff08;常用&#xff09;1、碳膜电阻2、合成碳膜电阻3、金属膜电阻4、金属氧化膜电阻5、玻璃釉膜电阻 3、厚膜电阻&#xff0…

vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)

<template><divstyle"display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model"url" placeholder"输入链接" ty…

智能家居1 -- 实现语音模块

项目整体框架: 监听线程4&#xff1a; 1. 语音监听线程:用于监听语音指令&#xff0c; 当有语音指令过来后&#xff0c; 通过消息队列的方式给消息处理线程发送指令 2. 网络监听线程&#xff1a;用于监听网络指令&#xff0c;当有网络指令过来后&#xff0c; 通过消息队列的方…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

【python】条件语句与循环语句

目录 一.条件语句 1.定义 2.条件语句格式 &#xff08;1&#xff09;if &#xff08;2&#xff09;if-else &#xff08;3&#xff09;elif功能 &#xff08;4&#xff09;if嵌套使用 3.猜拳游戏 二.循环语句 1. while循环 2.while嵌套 3.for循环 4.break和conti…

被问了n遍的小程序地理位置权限开通方法

小程序地理位置接口有什么功能&#xff1f; 在平时我们在开发小程序时&#xff0c;难免会需要用到用户的地理位置信息的功能&#xff0c;小程序开发者开放平台新规要求如果没有申请开通微信小程序地理位置接口( getLocation )&#xff0c;但是在代码中却使用到了相关接口&#…

人工智能概述与入门基础简述

人工智能&#xff08;AI&#xff09;是计算机科学的一个分支&#xff0c;它致力于创建能够执行通常需要人类智能的任务的机器。这篇科普文章将全面介绍人工智能的基本概念、发展历程、主要技术、实际应用以及如何入门这一领域。 一、人工智能的定义与发展历程 人工智能的概念…

Leetcode 3138. Minimum Length of Anagram Concatenation

Leetcode 3138. Minimum Length of Anagram Concatenation 1. 解题思路2. 代码实现 题目链接&#xff1a;3138. Minimum Length of Anagram Concatenation 1. 解题思路 这一题的话我们首先统计出来所有的字母出现的频率。 然后&#xff0c;我们只需要从头开始重新计数一下&…

巴菲特股东大会5万字完整版来了!

北京时间5月4日晚22:15&#xff0c;一年一度的伯克希尔股东大会在美国小镇奥马哈重磅开幕。 在今年的伯克希尔股东大会上&#xff0c;比尔盖茨、苹果CEO蒂姆库克等商界大佬均现身大会现场。 在股东大会上&#xff0c;巴菲特先后谈到了已故老搭档芒格、减持苹果、AI影响、现金储…

springboot版本升级,及解决springsecurity漏洞问题

背景&#xff1a; 项目中要解决 Spring Security RegexRequestMatcher 认证绕过漏洞&#xff08;CVE-2022-22978&#xff09; 漏洞问题&#xff0c;并且需要将项目的版本整体升级到boot版本2.1.7&#xff0c;升级改造过程非常的痛苦&#xff0c;一方面对整个框架的代码不是很熟…

六淳科技IPO终止背后:十分着急上市,大额分红,实控人买豪宅

华西证券被暂停保荐业务资格6个月的影响力逐渐显现。 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;东莞六淳智能科技股份有限公司&#xff08;下称“六淳科技”&#xff09;及其保荐人撤回上市申请材料。因此&#xff0c;深圳证券交易所决定终止对其首次公开发行…

LangChain 概念篇(喂饭级)

LangChain 介绍 LangChain 是一个用于开发由语言模型驱动的应用程序的框架。 LangChain 框架的设计目标 支持应用程序让其不仅会通过 API 调用语言模型&#xff0c;而且还会数据感知&#xff08;将语言模型连接到其他数据源&#xff09;&#xff0c;Be agentic&#xff08;允…

专注 APT 攻击与防御—基于UDP发现内网存活主机

UDP简介&#xff1a; UDP&#xff08;User Datagram Protocol&#xff09;是一种无连接的协议&#xff0c;在第四层-传输层&#xff0c;处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点&#xff0c;也就是说&#xff0c;当报文发送之后&#xf…

spring高级篇(十)

1、内嵌tomcat boot框架是默认内嵌tomcat的&#xff0c;不需要手动安装和配置外部的 Servlet 容器。 简单的介绍一下tomcat服务器的构成&#xff1a; Catalina&#xff1a; Catalina 是 Tomcat 的核心组件&#xff0c;负责处理 HTTP 请求、响应以及管理 Servlet 生命周期。它包…

OpenHarmony实战开发-应用侧调用前端页面函数

应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数。 在下面的示例中&#xff0c;点击应用侧的“runJavaScript”按钮时&#xff0c;来触发前端页面的htmlTest()方法。 前端页面代码。 <!-- index.html --> <!DOCTYPE html> <html> <…