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全栈学习记录(二十二)多态性、封装、绑定方法与非绑定方法
多态性、封装、绑定方法与非绑定方法 文章目录 多态性、封装、绑定方法与非绑定方法一、多态性二、封装三、绑定方法与非绑定方法 一、多态性 多态指的是同一种事物的多种形态,如水:冰、水蒸气、液态水,又如动物:猫、狗、猪。 多…...
用Python制作自己的聊天机器人:从零开始构建智能对话助手
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 近年来,聊天机器人已经成为日常生活中不可或缺的工具,从自动客服到个人助手,聊天机器人在各类应用中广泛存在。如果你想了解如何制作一个自己的聊天机器人,那么这篇文章将带你一步步实现这个目标。我们将使用…...
LabVIEW裂纹深度在线监测系统
随着铁路运输技术的快速发展,火车安全问题成为重中之重,尤其是轮面裂纹的检测和管理。裂纹的出现可能导致严重的列车事故,因此,建立可靠的在线监测系统,实时掌握裂纹情况,对保障铁路运输安全至关重要。 La…...
工业物联网的伦理和社会影响
随着科技的飞速发展,工业物联网(IIoT)已经成为现代工业领域的重要组成部分。它通过将各种设备、传感器和系统连接起来,实现了生产过程的智能化、自动化和高效化。然而,在享受工业物联网带来的巨大便利和经济效益的同时…...
TCP --- 确认应答机制以及三次握手四次挥手
序言 在前一篇文章中,我们介绍了 UDP协议 (点击查看)👈,该协议给我们的感觉就两个字 — 简单,只是将我们的数据进行简单的添加报头然后发送。当然使用起来虽然简单,但是否能送到目的地,那就要看网络的状态了…...
GPT带我学-设计模式17-装饰器模式
概述 装饰器模式(Decorator Pattern)是一种结构型设计模式,允许你在不改变对象接口的前提下,动态地给对象添加新功能。这个模式通常用于扩展类的功能。 基本结构 组件接口(Component):定义一…...
【Redis】如何在 Ubuntu 上安装 Redis 5
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容主要介绍如何在 Ubuntu 上安装 Redis5 一些碎碎念: 本来这期内容介绍如何在 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 …...
堆排序算法的原理与应用
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它具有时间复杂度为 O(n log n) 的优点,并且空间复杂度为 O(1),是一种不稳定的排序算法。本文将详细介绍堆排序的工作原理、步骤以及它的应用场景。 一、堆排序的基本概念…...
【2024版本】Mac/Windows IDEA安装教程
IDEA 2024版本真的很强大,此外JDK发布了最新稳定版 JDK21 ,只有新版本支持JDK 21、JDK22。原来数据库插件不支持redis等一些NoSql的数据库的连接,如果要使用需要自己单独装收费的插件。直接打开idea就很吃内存了,再打开其他一大堆…...
Oracle bbed编译安装及配置
1. 什么是bbed ? Oracle Block Brower and EDitor Tool,是一个可以对oracle data block进行查看,编辑修改的内置工具。对于bbed,oracle本身是不提供支持的。 2. 如何编译bbed环境? 10g版本: 1) 编译bbed cd $ORACL…...
MindSearch 部署到Github Codespace 和 Hugging Face Space
conda init后需要重开终端,不然一键复制会导致后续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 是一个项目管理工具,基于 POM(Project Object Model,项目对象模型)的概念,Maven 可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件 大白话: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修复,我们在其中宣布Kotlin K2编译器为Stable。以下是本次发布的一些亮点: 数据类复制函数将具有与构造函数相同的可见性来自默认目标层次结构的源集的静态访…...
Python内存管理与泄漏排查实战
Python内存管理与泄漏排查实战 Python作为一种高级编程语言,因其易读性和丰富的标准库而备受开发者青睐。然而,随着项目的复杂度增加,内存管理问题可能会影响程序的性能,甚至导致内存泄漏。为了构建健壮且高效的应用程序…...
828华为云征文|华为云Flexus云服务器X实例搭建部署H5美妆护肤分销商城、前端uniapp
准备国庆之际,客户要搭个 H5 商城系统,这系统好不容易开发好啦,就差选个合适的服务器上线。那可真是挑花了眼,不知道哪款性价比高呀!就像在琳琅满目的选择前。最终慧眼识珠,选择了华为云 Flexus X。至于为什…...
初学51单片机之I2C总线与E2PROM二
总结下上篇博文的结论: 1:ACK信号在SCL为高电平期间会一直保持。 2:在字节数据传输过程中如果发送电平跳变,那么电平信号就会变成重复起始或者结束的信号。(上篇博文的测试方法还是不能够明确证明这个结论࿰…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
