当前位置: 首页 > news >正文

python全栈学习记录(二十二)多态性、封装、绑定方法与非绑定方法

多态性、封装、绑定方法与非绑定方法

文章目录

  • 多态性、封装、绑定方法与非绑定方法
  • 一、多态性
  • 二、封装
  • 三、绑定方法与非绑定方法

一、多态性

多态指的是同一种事物的多种形态,如水:冰、水蒸气、液态水,又如动物:猫、狗、猪。
多态性是指不考虑对象类型的情况下直接使用对象的方法,这就要求设计者把对象的方法统一为一种,例如:

#猫狗猪都是可以叫,那就可以使用一个接口来调用叫这个功能
class Aminal():passclass Cat(Aminal):def talk(self):print('喵喵喵')class Dog(Aminal):def talk(self):print('汪汪汪')class Pig(Aminal):def talk(self):print('哼哼哼')#接口函数
def talk(aminal):aminal.talk()c=Cat()
d=Dog()
p=Pig()
talk(c)
talk(d)
talk(p)
<<<喵喵喵
<<<汪汪汪
<<<哼哼哼

python本身也是支持多态性的,len函数就是对多种容器类型封装的接口函数,所以使用len函数时只需要将容器的实例传入就可以得到容器的长度值。

由上面的例子我们可以知道多态性的本质就是在不同的类型中定义相同的方法,这样就可以不考虑具体的类型直接调用统一的方法了。
python中还可以使用抽象类来实现多态性。

import abc# Animal是抽象类,用来指定子类的标准,不能被实例化
class Animal(metaclass=abc.ABCMeta):@abc.abstractmethod #这个装饰器用来约束子类必须定义speak方法def speak(self):pass       class People(Animal):#继承抽象类的子类不定义speak方法时会报错def speak(self):print('say hello')class Dog(Animal):def speak(self):print('汪汪汪')p=People()
d=Dog()
p.speak()
d.speak()
<<<say hello
<<<汪汪汪

python中还存在一种名为鸭子类型的规范,也就是叫的声音像鸭子,并且你走路的样子也像鸭子,那你就是鸭子。

class Disk:def read(self):print('disk read')def write(self):print('disk wirte')class Process:def read(self):print('process read')def write(self):print('process wirte')class File:def read(self):print('file read')def write(self):print('file wirte')

上述代码定义了三个类型鸭子、管道、文件,虽然这三者之间没有任何的联系,但是他们都有read和write方法,所以可以将他们都视为文件类型来使用。通过这种约定式的方式实现多态可以减少程序的耦合度。

二、封装

封指属性对外是隐藏的,但对内是开放的。装指申请一个名称空间,往里装入一系列名字/属性。所以封装指使用类存放一系列属性方法,并且这些属性方法只对类内部开放。

封装属性的目的: 隐藏之后是为了不让外部使用直接使用,需要类内部开辟一个接口然后让类外部的使用通过接口来间接地操作隐藏的属性。精髓在于:我们可以在接口之上附加任意逻辑,从而严格控制使用者对属性的操作。

封装方法的目的:隐藏方法是为了不让外不直接使用,需要类内部开辟一个接口然后在接口内去调用隐藏的功能。精髓在于:隔离了复杂度。

python中隐藏属性和方法的方式是在变量前面加上__。但是

  • 这种隐藏仅仅只是一种语法上的变形操作(变量在类定义阶段被修改为_类名__属性/方法)
  • 这种语法上的变形只在类定义阶段发生一次,因为类体代码仅仅只在类定义阶段检测一次
  • 这种隐藏是对外不对内的,即在类的内部可以直接访问,而在类的外则无法直接访问,原因是在类定义阶段,类体内代码统一发生了一次变形
  • 如果不想让子类的方法覆盖父类的,可以将该方法名前加一个__开头
class A():__a=1def __b(self):#类内部可以直接访问隐藏属性print(self.__a)a=A()
print(A.__dict__)
#在类外部可以通过_类名__属性/方法的方式访问
a._A__b()
#类外部加入的__属性不会再次改名
a.__c=2
print(a.__dict__)
<<< {...,'_A__a': 1, '_A__b': <function A.__b at 0x0000018C8E8E9160>,...}
<<<1
<<< {'__c': 2}

将属性隐藏起来的目的是通过设置相应的接口来限制用户对隐藏属性的修改。

#控制名字的输入
class TellName():def __init__(self,name):self.__tell_name(name)self.__name=namedef __tell_name(self,name):if not isinstance(name,str): #判断name是否为str类型的对象raise TypeError('姓名必须为字符串') #抛出TypeError('姓名必须为字符串')的报错信息def check_name(self):print(self.__name)t=TellName(111)
<<< TypeError: 姓名必须为字符串t=TellName('李四')
t.check_name()
<<<李四

将方法隐藏起来的目的是为了减少复杂度。

class Atm():def __card(self):passdef __auth(self):passdef __input(self):passdef __take_money(self):passdef withdraw(self):self.__card()self.__auth()self.__input()self.__take_money()a=Atm()
a.withdraw()

上述代码只需要在类外调用withdraw方法就可以完成整个取款流程了,大大降低了操作的复杂度。

python中property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接引用。

class People:def __init__(self,name):self.__name=name@property #伪装成obj.namedef name(self):#返回值就是伪装的obj.name的值return '<名字是:%s>' %self.__name@name.setter #伪装name的修改方式obj.name=值def name(self,name):if type(name) is not str:raise TypeError('名字必须是str类型')self.__name=name@name.deleter #伪装name的删除方式del obj.namedef name(self):del self.__namepeo1=People('111')
print(peo1.name)
peo1.name='222'
print(peo1.name)
del peo1.name
print(peo1.name)<<< <名字是:111>
<<< <名字是:222>
<<< AttributeError: 'People' object has no attribute '_People__name'

三、绑定方法与非绑定方法

绑定方法:绑定给谁就应该由谁来调用,谁来调用就会将谁当作第一个参数自动传入
绑定方法分为两类:

  • 绑定给对象方法:在类内部定义的函数(没有被任何装饰器修饰的),默认就是绑定给对象用的
  • 绑定给类的方法:在类内部定义的函数如果被装饰器@classmethod装饰,那么则是绑定给类的,应该由类来调用,类来调用就自动将类当作第一个参数自动传入。

非绑定方法:类中定义的函数如果被装饰器@staticmethod装饰,那么该函数就变成非绑定方法,既不与类绑定,又不与对象绑定,意味着类与对象都可以来调用,但是无论谁来调用,都没有任何自动传值的效果,就是一个普通函数。

class Mysql:def __init__(self, ip):self.ip=ip#绑定给对象的方法,第一个值为self,默认是给对象调用的def tell_info(self):print('%s'%self.ip)#绑定给类的方法,第一个值为cls,默认是给类调用的@classmethoddef from_conf(cls):#cls就是Mysql,cls('127.0.0.1')这是一种在类内部完成实例化的方式return cls('127.0.0.1')#不绑定的方法,对象和类都可以调用@staticmethoddef func():print('不与任何人绑定')m=Mysql('172.30.156.0')
m.tell_info()
#绑定给对象的方法一般都是通过类调用的
#若是通过对象调用m.from_conf().tell_info(),会将对象对应的类传给cls
Mysql.from_conf().tell_info()
m.func()
Mysql.func()<<<172.30.156.0
<<<127.0.0.1
<<<不与任何人绑定
<<<不与任何人绑定

相关文章:

python全栈学习记录(二十二)多态性、封装、绑定方法与非绑定方法

多态性、封装、绑定方法与非绑定方法 文章目录 多态性、封装、绑定方法与非绑定方法一、多态性二、封装三、绑定方法与非绑定方法 一、多态性 多态指的是同一种事物的多种形态&#xff0c;如水&#xff1a;冰、水蒸气、液态水&#xff0c;又如动物&#xff1a;猫、狗、猪。 多…...

用Python制作自己的聊天机器人:从零开始构建智能对话助手

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 近年来,聊天机器人已经成为日常生活中不可或缺的工具,从自动客服到个人助手,聊天机器人在各类应用中广泛存在。如果你想了解如何制作一个自己的聊天机器人,那么这篇文章将带你一步步实现这个目标。我们将使用…...

LabVIEW裂纹深度在线监测系统

随着铁路运输技术的快速发展&#xff0c;火车安全问题成为重中之重&#xff0c;尤其是轮面裂纹的检测和管理。裂纹的出现可能导致严重的列车事故&#xff0c;因此&#xff0c;建立可靠的在线监测系统&#xff0c;实时掌握裂纹情况&#xff0c;对保障铁路运输安全至关重要。 La…...

工业物联网的伦理和社会影响

随着科技的飞速发展&#xff0c;工业物联网&#xff08;IIoT&#xff09;已经成为现代工业领域的重要组成部分。它通过将各种设备、传感器和系统连接起来&#xff0c;实现了生产过程的智能化、自动化和高效化。然而&#xff0c;在享受工业物联网带来的巨大便利和经济效益的同时…...

TCP --- 确认应答机制以及三次握手四次挥手

序言 在前一篇文章中&#xff0c;我们介绍了 UDP协议 (点击查看)&#x1f448;&#xff0c;该协议给我们的感觉就两个字 — 简单&#xff0c;只是将我们的数据进行简单的添加报头然后发送。当然使用起来虽然简单&#xff0c;但是否能送到目的地&#xff0c;那就要看网络的状态了…...

GPT带我学-设计模式17-装饰器模式

概述 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;允许你在不改变对象接口的前提下&#xff0c;动态地给对象添加新功能。这个模式通常用于扩展类的功能。 基本结构 组件接口&#xff08;Component&#xff09;&#xff1a;定义一…...

【Redis】如何在 Ubuntu 上安装 Redis 5

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 本期内容主要介绍如何在 Ubuntu 上安装 Redis5 一些碎碎念&#xff1a; 本来这期内容介绍如何在 Centos 安装 Redis …...

房屋水电费记账本:内置的数组数据击按钮不能删除,页面手动添加的可以删除

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>房租水电费记录</title><script type&qu…...

【ubuntu】apt是什么

目录 1.apt简介 2.常用apt指令 2.1安装 2.2更新列表 2.3更新已经安装的软件包 2.4搜索软件包 2.5显示软件包信息 2.6移除软件包 2.7清理无用的安装包 2.8清理无用的依赖项 3.apt和apt-get 3.1区别 3.2 总结 1.apt简介 apt的全称是advanced package …...

堆排序算法的原理与应用

堆排序&#xff08;Heap Sort&#xff09;是一种基于堆数据结构的比较排序算法。它具有时间复杂度为 O(n log n) 的优点&#xff0c;并且空间复杂度为 O(1)&#xff0c;是一种不稳定的排序算法。本文将详细介绍堆排序的工作原理、步骤以及它的应用场景。 一、堆排序的基本概念…...

【2024版本】Mac/Windows IDEA安装教程

IDEA 2024版本真的很强大&#xff0c;此外JDK发布了最新稳定版 JDK21 &#xff0c;只有新版本支持JDK 21、JDK22。原来数据库插件不支持redis等一些NoSql的数据库的连接&#xff0c;如果要使用需要自己单独装收费的插件。直接打开idea就很吃内存了&#xff0c;再打开其他一大堆…...

Oracle bbed编译安装及配置

1. 什么是bbed &#xff1f; Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看&#xff0c;编辑修改的内置工具。对于bbed&#xff0c;oracle本身是不提供支持的。 2. 如何编译bbed环境&#xff1f; 10g版本&#xff1a; 1) 编译bbed cd $ORACL…...

MindSearch 部署到Github Codespace 和 Hugging Face Space

conda init后需要重开终端&#xff0c;不然一键复制会导致后续pip install会安装错环境 还是报错 ImportError: cannot import name AutoRegister from class_registry (/opt/conda/envs/mindsearch/lib/python3.10/site-packages/class_registry/__init__.py)pip install --…...

【Maven】依赖管理,Maven仓库,Maven核心功能

Maven 是一个项目管理工具&#xff0c;基于 POM&#xff08;Project Object Model&#xff0c;项目对象模型&#xff09;的概念&#xff0c;Maven 可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件 大白话&#xff1a;Maven 是一个项目管理工…...

Android wifi信号和漫游信号设置

1.wifi信号 /packages/modules/Wifi/framework/java/android/net/wifi/WifiManager.java Deprecated public static int calculateSignalLevel(int rssi, int numLevels) { if (rssi < MIN_RSSI) { //*/update wifi signal return 1;…...

检查cuda和显卡的可用性

检查cuda和显卡的可用性 import torch device_gpu torch.device(cuda if torch.cuda.is_available() else cpu) print(device_gpu) print(torch.cuda.is_available())...

Kotlin:2.0.20 的新特性

一、概述 Kotlin 2.0.20英文版官方文档 Kotlin 2.0.20发布了!这个版本包括对Kotlin 2.0.0的性能改进和bug修复&#xff0c;我们在其中宣布Kotlin K2编译器为Stable。以下是本次发布的一些亮点: 数据类复制函数将具有与构造函数相同的可见性来自默认目标层次结构的源集的静态访…...

Python内存管理与泄漏排查实战

Python内存管理与泄漏排查实战 Python作为一种高级编程语言&#xff0c;因其易读性和丰富的标准库而备受开发者青睐。然而&#xff0c;随着项目的复杂度增加&#xff0c;内存管理问题可能会影响程序的性能&#xff0c;甚至导致内存泄漏。为了构建健壮且高效的应用程序&#xf…...

828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp

准备国庆之际&#xff0c;客户要搭个 H5 商城系统&#xff0c;这系统好不容易开发好啦&#xff0c;就差选个合适的服务器上线。那可真是挑花了眼&#xff0c;不知道哪款性价比高呀&#xff01;就像在琳琅满目的选择前。最终慧眼识珠&#xff0c;选择了华为云 Flexus X。至于为什…...

初学51单片机之I2C总线与E2PROM二

总结下上篇博文的结论&#xff1a; 1&#xff1a;ACK信号在SCL为高电平期间会一直保持。 2&#xff1a;在字节数据传输过程中如果发送电平跳变&#xff0c;那么电平信号就会变成重复起始或者结束的信号。&#xff08;上篇博文的测试方法还是不能够明确证明这个结论&#xff0…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...