python基础教程十 再谈抽象

文章预览:

  • 章节前导
  • 1. 对象魔法
    • 1.1 多态
      • 1.1.1 多态和方法
    • 1.2 封装
    • 1.3 继承
  • 2. 类
    • 2.1 类到底是什么
    • 2.2 创建自定义类
    • 2.3 属性,函数,方法
    • 2.3再谈隐藏

章节前导

在前几章学习了python的内置的主要对象类型(数,字符串,列表,元组和字典),大致了解了众多的内置函数和标准库。还创建了自定义的函数。不过有一点还没有学习,那就是创建自己定义对象。这是接下来的重点。

创建自定义对象(尤其是对象类型或类)是一个python的核心概念。事实上,这个概念非常重要,是的python被视为一种面向对象的语言。

1. 对象魔法

在面向对象编程中。术语对象大致意味着一些列数据(属性)以及一套访问和操作这些数据的方法。使用对象而非全局变量和函数的原因有多个,下面列出了使用对象的最重要的好处。

多态:可对不同类型的对象执行相同的操作,而这些操作就像被施了魔法一样能够正常运行

封装:对外部隐藏有关对象工作原理的细节。

继承:可基于通用类创建出专用类。

1.1 多态

术语多态,意思是多种形态。这大致意味着即便你不知道变量指向的是哪种对象,也能够对其执行操作,且操作的行为将随对象所属类型而异。

1.1.1 多态和方法

你收到一个对象,却根本不知道它是如何实现的——它可能是众多形态中的任何一种。你只知道可以询问其价格,但这就够了。至于询问价格的方式,你应该很熟悉。

f.get_price()

像这样与对象属性相关联的函数称为方法,你在本书前面见过这样的函数:字符串 ,函数,列表和字典的方法。多态你其实也见过。
如果有一个变量x,你无须知道它是字符串还是一个列表就能调用方法count;只要你向这个方法提供一个字符作为参数,它就能正常运行。
下面做个实验代码如下

>>> from random import choice
>>> x=choice(["sdada",[1,2,3]])
>>> x.count(1)
>1

标准库模块random包含一个名为choice的函数,它从序列中随机选择一个元素。
执行这个代码没有报错说明选择的是那个列表,如果选择的是字符串会报错,但是无论字符串还是列表都存在count函数,我们无需关注x到底是什么类型,这就是多态。

1.2 封装

封装指的向外部隐藏不必要的细节。听起来有点像多态,这俩个概念很像,因为它们都是抽象原则。
但封装不同于多态,多态让你无需知道对象所属类(对象的类型)就能调用其方法,而封装让你无需知道对象的构造就能使用它。

1.3 继承

继承是另一种偷懒的方式。程序员总是想避免多次输入同样的代码。如果你已经有了一个类,并要创建一个与之很像的类,该如何办呢,那便是继承
你可能已经有了一个shape类,他知道如何将自己绘制到屏幕上。现在你想创建一个名为Rectangle的类,但他不仅知道如何将自己绘制到屏幕上,而且还有其他新功能。你不想重新编写方法draw,那么就使用继承方法。

2. 类

2.1 类到底是什么

本书前面反复提到了类,并将其用作类型的同义词。从很多方面来说,这正是类的定义——一种对象。每个对象都属于特定的类,并被称为该类的实例。
例如,如果你在窗外看到一只鸟,这只鸟就是鸟类的一个实例。鸟类是一个非常通用(抽象类)的类,他有多个子类:你看到的那只鸟可能属于子类云雀。你可以将鸟类视为所有鸟的集合,而云雀是其中一个子集。一个类的对象为另一个类的对象的子集时,前者就是后者的子集,因此云雀是鸟类的子集,而鸟类为云雀的超类

2.2 创建自定义类

我们终于要创建自定义类了! 下面是一个简单的示例

class person:def set_name(self,name):self.name=namedef get_name(self):return self.namedef greet(self):print("hello world! I'm{}.".format(self.name))s=person()
s.set_name("dasda")
s.greet()

这个示例包含三个方法定义,它们类似于函数定义,但位于class语句内。person当然是类的名称。
class语句创建独立的命名空间,用于在其中定于函数。一切看起来都挺好,但你可能想知道参数self是什么。
通过调用s.set_name(“dasda”)和s.greet()时,s都会作为第一个参数自动传递给它们。我将这个参数命名为self。实际上随便给这个参数命名,但鉴于它总指向对象本身,因此习惯上将其命名为self
显然self很有用,甚至必不可少。如果没有它,所有的方法都无法访问对象本身——要操作的属性所属对象。

2.3 属性,函数,方法

实际上,方法和函数的区别表现在前一节提到的参数self上。方法(更准确地说是关联的方法)将其第一个参数关联到它所属的实力,因此无需提供这个参数。

class Class:def method(self):print("I have a self")
def function():print("I don;t..")
instance=Class()
instance.method()
instance.method=function
instance.method()

运行结果
I have a self
I don;t…

请注意,有没有参数self并不取决于是否以刚才使用的方式(如instace,method)调用方法。实际上,完全可以让另一个变量指向同一方法。

class Bird:song='squaawk!'def sing(self):print(self.song)
bird=Bird()
bird.sing()
birdsong=bird.sing
birdsong()

运行结果:
squaawk!
squaawk!

虽然最后一个方法调用看起来很像函数调用,但变量bird送指向的是关联的方法 bird.sing,这意味着它也能够访问参数self(即它也被关联到类的实例)

2.3再谈隐藏

属性可将其定义为私有,私有属性不能从对象外部访问,只能通过存取器方法来访问。
python没有为私有属性提供直接的支持,而是要求程序员知道在什么情况下从外部修改属性是安全的。毕竟,你必须在知道如何使用对象之后才能使用它。然而,通过玩点小花招,可以获得类似私有属性的效果。
要让方法或属性成为私有的(不能从外边访问),只需让其名称以俩个下划线打头即可。

class f:def __output(self):print('hello world')def public(self):self.__output()

现在从外部不能访问__output,但在类中依然可以使用它。


a=f()
a.__output()
Traceback (most recent call last):File "E:\python\python练习\私有.py", line 9, in <module>a.__output()
AttributeError: 'f' object has no attribute '__output'. Did you mean: '_f__output'?
a.public()
hello world

虽然以俩个下划线打头有点怪异,但这样的方法类似于其他语言的标准私有方法。然而。幕后的处理手法并不标准;在类定义中,对所有以俩个下划线打头的名称都进行了转换,即在开头加上了一个下划线和类名。
只要知道这种幕后处理手法,就能从类外访问私有方法,然而不应这样做,

a._f__output()hello world

总之,你无法禁止别人访问对象的私有方法和属性,但这种名称修改方式发出来强烈的型号,让他们不要这样做。

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

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

相关文章

深度学习系列61:在CPU上运行大模型

1. 快速版 1.1 llamafile https://github.com/Mozilla-Ocho/llamafile 直接下载就可以用&#xff0c;链接为&#xff1a;https://huggingface.co/jartine/llava-v1.5-7B-GGUF/resolve/main/llava-v1.5-7b-q4.llamafile?downloadtrue 启动&#xff1a;./llava-v1.5-7b-q4.lla…

提升效率的电脑定时工具,AutoOff软件推荐

今天最软库给大家带来一款非常实用的电脑定时关机软件在我们日常办公的时候有的时候需要上传一些资料由于我们下班了&#xff0c;我们想让他上传完成之后我们才离开这时候呢&#xff0c;就可以用到这款定时工具了。 我们可以设置中设置在几小时或者几分钟之后让电脑进行关机我们…

基于springboot+vue的新闻资讯系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【HarmonyOS】DevEco Studio3.1x安装教程

目录 下载安装开发工具配置 下载 开发工具点击跳转→https://hmxt.org/deveco-studio 点击‘立即下载’ 安装 将安装包解压 双击安装&#xff0c;点击“Next” 选择安装目录&#xff0c;点击Next 勾选创建桌面快捷方式和环境的添加&#xff0c;点击Next 点击Instal…

Python实现ROC工具判断信号:股票技术分析的工具系列(7)

Python实现ROC工具判断信号&#xff1a;股票技术分析的工具系列&#xff08;7&#xff09; 介绍算法公式 代码rolling函数介绍完整代码data代码ROC.py 介绍 ROC&#xff08;变动率指标&#xff09;是一种技术分析指标&#xff0c;用于衡量价格变动的速度和幅度&#xff0c;计算…

系统运维-Linux Qemu虚拟机命令行安装和virsh命令使用

安装 首先安装qemu-kvm virt-install libvirt yum install qemu-kvm virt-install libvirt -y #安装所需 安装完要启动libvirtd systemctl restart libvirtd #启动libvirtd systemctl enable libvirtd #设置自启动libvirtd 安装虚拟机 使用virsh命令 实例&#x…

LCR 127. 跳跃训练

解题思路&#xff1a; 动态规划&#xff0c;类似于斐波那契数列&#xff0c;但需要根据题意调整初始值dp[0]和dp[1]&#xff0c;递推公式由最后一跳跳一次或两次得到。 class Solution {public int trainWays(int num) {if(num<1) return 1;int[] dpnew int[num1];//当平台…

抖音视频评论批量采集软件|视频下载工具

《轻松搞定&#xff01;视频评论批量采集软件&#xff0c;助您高效工作》 在短视频这个充满活力和创意的平台上&#xff0c;了解用户评论是了解市场和观众心声的重要途径之一。为了帮助您快速获取大量视频评论数据&#xff0c;我们推出了一款操作便捷、功能强大的软件&#xff…

JVM运行时数据区——堆

文章目录 1、堆的核心概述1.1、JVM实例与堆内存的对应关系1.2、堆与栈的关系1.3、JVM堆空间划分 2、设置堆内存大小与内存溢出2.1、设置堆内存大小2.2、内存溢出案例 3、新生代与老年代4、图解对象分配过程5、Minor GC、Major GC、Full GC5.1、GC的分类5.2、分代式GC策略的触发…

Redis实现乐观锁+秒杀场景demo

在Redis中&#xff0c;乐观锁通常是通过使用 WATCH、MULTI 、EXEC和DISCARD命令实现的。这种乐观锁机制允许客户端在执行事务期间监视一个或多个键&#xff0c;并且只有在事务执行期间没有其他客户端修改被监视的键时&#xff0c;才会执行事务。 应用场景&#xff1a; 库存控…

Linux 之一:Linux 简介、客户端、安装

Linux简介 Linux 内核最初只是由芬兰人林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;在赫尔辛基大学上学时出于个人爱好而编写的。 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹于…

如何学习、上手点云算法(二):点云处理相关开源算法库、软件、工具

写在前面 本文内容 一些用于点云处理的开源算法库、软件介绍&#xff0c;主要包含&#xff1a; CloudCompare, MeshLab, PCL, Open3D, VTK, CGAL等 不定时更新 平台/环境 Windows10, Ubuntu1804, CMake, Open3D, PCL 转载请注明出处&#xff1a; https://blog.csdn.net/qq_41…

Springboot实现缓存预热

很多时候我们代码中使用缓存时都是先判断缓存中没有数据我们再读取数据库而有则直接使用缓存数据&#xff0c;而在系统冷启动(当系统重启或新启动时&#xff0c;缓存是空的&#xff0c;这被称为冷启动)时&#xff0c;我们毫无意外都是直接获取数据库的内容&#xff0c;这时候缓…

计算机网络-网络安全(二)

1.应用层安全协议&#xff1a; S-HTTP或SHTTP&#xff08;Sec HTTP&#xff09;&#xff0c;安全超文本传输协议&#xff0c;是HTTP扩展&#xff0c;使用TCP的80端口。HTTPS&#xff1a;HTTPSSL&#xff0c;使用TCP的443端口。和TLS&#xff08;传输层安全标准&#xff09;是双…

[Redis]——Spring整合Redis(SpringDataRedis)

⭐准备工作&#xff1a; 确保Redis服务已启动idea开发环境 ⭐Redis整合步骤&#xff1a; 1.pom文件引入依赖 2.yml文件配置连接信息 3.修改Redis序列化方式 4.注入RedisTemplate 使用 小知识&#xff1a; Spring整合的Redis可以将Object对象自动序列化成字符串&#xff0…

RabbitMQ分享

RabbitMQ遵循AMQP协议&#xff0c;自身采用Erlang RabbitMQ工作模式 生产者发消息&#xff0c;启动多个消费者实例来消费消息&#xff0c;每个消费者仅消费部分信息&#xff0c;可达到负载均衡的效果。 RabbitMQ三种常用交换机类型&#xff1a; 交换机主要起调度分发作用。 …

大语言模型LLM代码:PyTorch库与ChatGLM模型

文章目录 通过阅读大语言模型的代码,熟悉并理解PyTorch大语言模型LLM代码:PyTorch库与ChatGLM模型大语言模型中的PyTorchChatGLM3-6B模型代码ChatGLMModel类总览ChatGLMModel类说明ChatGLMModel类核心代码片段通过阅读大语言模型的代码,熟悉并理解PyTorch 大语言模型LLM代码…

【Oracle Database】如何远程连接服务器、创建用户、从本地dmp导入表

C:\Users\test>imp test/123456ip/orcl:1521 fileE:\db.dmp tablestable1,table2Import: Release 11.2.0.3.0 - Production on 星期一 3月 4 12:59:09 2024Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.IMP-00058: 遇到 ORACLE 错误 1263…

电机应用-正点原子直流有刷电机例程笔记

目录 基础驱动实验&#xff1a;调速和换向 初始化工作 电机基础驱动API 电压、电流、温度检测实验 初始化工作 采集工作 编码器测速实验 编码器接口计数原理 初始化工作 编码器测速工作 速度环控制实现 PID相关函数 PID运算 电流环控制实现 PID相关函数 PID运算…

Shell管道和过滤器

一、Shell管道 Shell 还有一种功能&#xff0c;就是可以将两个或者多个命令&#xff08;程序或者进程&#xff09;连接到一起&#xff0c;把一个命令的输出作为下一个命令的输入&#xff0c;以这种方式连接的两个或者多个命令就形成了管道&#xff08;pipe&#xff09;。 重定…