Python之面向对象和继承

news2024/11/16 1:48:43

一、关于None和判断的总结

1.1、None是什么?

  1. 与C和JAVA不同,python中是没有NULL的,取而代之的是None
  2. None是一个特殊的常量,表示变量没有指向任何对象。
  3. 在Python中,None本身实际上也是对象,有自己的类型NoneType
  4. 你可以将None赋值给任何变量,但我们不能创建NoneType类型的对象
obj = None
obj2 = None
print(type(None))
print(id(None))
print(id(obj))
print(id(obj2))

 执行结果:

<class 'NoneType'>
140717958924280
140717958924280
140717958924280

⚠️None不是False,None不是0,None不是空字符串。None和任何其他的数据类型比较永远返回False。

1.2、None和其他类型的比较

  • None和其他任何类型比较都会返回False

    a = None
    if a is None and a==None:
      print("a是None")       #会执行
    if a==False or a==0:
      print("None不等于False")    #不会被打印
    
  • 空列表、空字符串、0之间的比较

         1、if语句判断时,空列表[]、空字典{}、空元组()、0等一系列代表空和无的对象会被转换成False

a=[];b=();c={};d="";e=0;f=None
if (not a) and (not b) and (not c) and (not d) and (not e) and (not f):
  print("if判断时,空列表[]、空字符串、0、None等代表空和无的对象会被转换成False")

         2、==is判断时,空列表、空字符串不会自动转成False

a=[];b=();c={};d="";e=0;
if (a==False or d==False):
  print("==时,空列表、空字符串不是False!")  #不会执行
if(e==False):
  print("==时,0会转成False")

 

二、面向对象三大特征介绍

Python是面向对象的语言,支持面向对象编程的三大特性:继承、封装(隐藏)、多态。

2.1、封装(隐藏)

隐藏对象的属性和实现细节,只对外提供必要的方法。相当于将“细节封装起来”,只对外暴露“相关调用方法”。

通过前面学习的“私有属性、私有方法”的方式,实现“封装”。Python追求简洁的语法,没有严格的语法级别的“访问控制符”,更多的是依靠程序员自觉实现。

2.2、继承

继承可以让子类具有父类的特性,提高了代码的重用性。

从设计上是一种增量进化,原有父类设计不变的情况下,可以增加新的功能,或者改进已有的算法。

2.3、多态

多态是指同一个方法调用由于对象不同会产生不同的行为。生活中这样的例子比比皆是:同样是休息方法,人不同休息方法不同。张三休息是睡觉,李四休息是玩游戏,程序员休息是“敲几行代码”。

三、继承

3.1、子类扩展父类

继承是面向对象编程的三大特征之一。继承让我们更加容易实现类的扩展。实现代码的重用,不用再重新发明轮子(don’t reinvent wheels)。

如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度。已有的类,我们称为“父类或者基类”,新的类,我们称为“子类或者派生类”。

3.2、语法格式

Python支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:

class 子类类名(父类1[,父类2,...]):
    类体

如果在类定义中没有指定父类,则默认父类是object类。也就是说,object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__()

关于构造函数:

  1. 子类不重写 __init__,实例化子类时,会自动调用父类定义的 __init__
  2. 子类重写了__init__ 时,实例化子类,就不会调用父类已经定义的 __init__
  3. 如果重写了__init__ 时,要使用父类的构造方法,可以使用 super 关键字,也可以使用如下格式调用:

父类名.__init__(self, 参数列表)

class Person:
  def __init__(self,name,age):
    print("Person的构造方法")
    self.name = name
    self.age = age
​
  def say_age(self):
    print(self.name,"的年龄是:",self.age)
​
​
class Student(Person):
​
  def __init__(self,name,age,score):
    # 子类并不会自动调用父类的__init__(),我们必须显式的调用它。
    # Person.__init__(self, name, age)
    # super(Student,self).__init__(name,age)
​
    print("Student的构造方法")
    # self.name = name
    # self.age = age
    self.score = score
​
​
s1 = Student("张三",15,85)
#s1.say_age()
print(dir(s1))

 运行结果:

张三 的年龄是: 15
['_Person__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_age', 'score']

四、类成员的继承和重写

  1. 成员继承:子类继承了父类除构造方法之外的所有成员。

    ⚠️(私有属性、私有方法也被继承)

  2. 方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”

【操作】继承和重写的案例

class Person:
  def __init__(self,name,age):
    self.name = name
    self.age = age
​
  def say_age(self):
    print(self.name,"的年龄是:",self.age)
​
  def say_name(self):
    print("我是",self.name)
​
​
class Student(Person):
​
  def __init__(self,name,age,score):
    Person.__init__(self,name,age) 
    self.score = score
​
  def say_score(self):
    print(self.name,"的分数是:",self.score)
​
  def say_name(self):   #重写父类的方法
    print("报告老师,我是",self.name)
​
s1 = Student("张三",15,85)
s1.say_score()
s1.say_name()
s1.say_age()

 执行结果:

张三 的分数是: 85
报告老师,我是 张三
张三 的年龄是: 15

4.1、查看类的继承层次结构

通过类的方法mro()或者类的属性__mro__可以输出这个类的继承层次结构。

【操作】 查看类的继承层次结构

class A:pass
class B(A):pass
class C(B):pass
​
print(C.mro())

执行结果:

[<class '__main__.C'>, <class '__main__.B'>, <class '__main__.A'>, <class 'object'>] 

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

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

相关文章

浅谈自动化测试框架开发

在自动化测试项目中&#xff0c;为了实现更多功能&#xff0c;我们需要引入不同的库、框架。 首先&#xff0c;你需要将常用的这些库、框架都装上。 pip install requests pip install selenium pip install appium pip install pytest pip install pytest-rerunfailures pip …

【深度学习】基于pytorch的FER2013人脸表情图像识别(ResNet/VGG/DenseNet)

题目要求 1.1. 任务要求 数据集&#xff1a;Facial Expression Recognition Challenge&#xff0c;共有7类&#xff1a;生气、恶心、害怕、快乐、悲伤、惊讶、中性。 基本要求&#xff08;50%&#xff09;&#xff1a;构建ResNet分类模型18层。 改进&#xff08;30%&#x…

Disruptor(1):Disruptor简介

1 什么是Disruptor Martin Fowler在自己网站上写了一篇LMAX架构的文章&#xff0c;在文章中他介绍了LMAX是一种新型零售金融交易平台&#xff0c;它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上&#xff0c;其核心是一个业务逻辑处理器&#xff0c;它能够在一个线…

如何关闭电脑自动更新?一招教你永久关闭!

百度安全验证https://baijiahao.baidu.com/s?id1749271752443309717

《微服务架构设计模式》第三章 微服务架构中的进程间通信

内容总结自《微服务架构设计模式》 微服务架构中的进程间通信 一、通信概述通信方式API定义消息格式 二、同步通信RESTgRPC断路器服务发现 三、异步通信消息消息通道消息代理消息问题 ) 一、通信概述 通信方式 有很多进程间通信技术可供开发者选择。服务可以使用基于同步请求…

国产操作系统介绍和安装

国产操作系统 分类 操作系统分类国产操作系统银河麒麟中科方德统信UOS红旗Linux深度系统优麒麟系统 具体介绍 麒麟操作系统 麒麟操作系统&#xff08;Kylin操作系统&#xff0c;简称麒麟OS&#xff09;&#xff0c;是一种国产操作系统&#xff0c;由国防科技大学研发&#x…

【Pandas】pandas用法解析(二)

一、生成数据表 二、数据表信息查看 三、数据表清洗 四、数据预处理 ———————————————— 目录 五、数据提取 1.按索引提取单行的数值 2.按索引提取区域行数值 3.重设索引 4.设置日期为索引 5.提取4日之前的所有数据 6.使用iloc按位置区域提取数据 7…

Java线程生命周期详解

前言一、线程的生命周期二、线程状态转换三、线程生命周期示例结束语 前言 Java中的线程生命周期是多线程开发的核心概念。了解线程的生命周期以及它们如何进行状态转换对于编写有效且无错误的多线程程序至关重要。 一、线程的生命周期 Java线程主要有以下几个状态&#xff…

离散数学题目收集整理练习(期末过关进度80%~100%)完结撒花

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;离散数学考前复习&#xff08;知识点题&#xff09; &#x1f353;专栏&#xff1a;概率论期末速成&#xff08;一套卷&#xff09; &#x1f433;专栏&#xff1a;数字电路考前复习 &#x1f31f;博主的其他文章&…

UG NX二次开发(C#)-外部模式-导出dwg格式文件

文章目录 1、前言2、在UG NX界面中导出DWG的操作2.1 打开三维模型2.2 创建二维工程制图2.3 导出工程图纸3、采用NXOpen(C#)二次开发实现1、前言 在我们实际使用过程中,经常会用到不同软件之间的数据转换,数据转换是通过通用标准文件来实现的。当然,在三维转二维过程中,dwg…

4.部署Placement服务

Placement服务是从nova服务中拆分出来的组件&#xff0c;Placement组件应该在 Nova之前安装&#xff1b; Placement服务用于跟踪节点资源&#xff08;比如计算节点&#xff0c;存储资源池&#xff0c;网络资源池等&#xff09;的使用情况&#xff0c;提供自定义资源的能力&…

CSS基础学习--14 Position(定位)

一、定义 position属性指定了元素的定位类型 position 属性的五个值&#xff1a; staticrelativefixedabsolutesticky 元素可以使用的顶部&#xff0c;底部&#xff0c;左侧和右侧属性定位。然而&#xff0c;这些属性无法工作&#xff0c;除非是先设定position属性。他们也有…

scratch lenet(1): 读写 pgm 图像文件

scratch lenet(1): 读写 pgm 图像文件 文章目录 scratch lenet(1): 读写 pgm 图像文件1. 目的2. pgm 格式介绍2.1 概要2.2 meta 信息2.3 像素内容 3. 创建 .pgm 文件4. 使用C语言读取 .pgm 灰度图文件4.1 实现4.2 解释 5. 使用C语言保存 .pgm 灰度图文件 1. 目的 最近在 githu…

车载软件架构 —— 闲聊几句AUTOSAR OS(四)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标准。到最…

初识Telegraf、InfluxDB和Grafana铁三角形成的监控可视化解决方案

文章目录 前言原始的监控靠人盯进化的监控靠批处理脚本高端的监控靠完整的可视化解决方案Telegraf、InfluxDB和Grafana铁三角TelegrafInfluxDBGrafana Grafana仪表板展示服务器资源总览负载和内存使用网络带宽磁盘IOIO延迟其他指标进程信息 总结 前言 数据监控目前用于各行各业…

Cracking C++(13): 读取不超过n个字符

文章目录 1. 目的2. 正确用法实例3. 纠正错误用法3.1 错误用法3.2 让 AddressSanitizer 告诉你错误3.3 解释 4. 总结 1. 目的 在读取 pgm 格式图像的 meta 信息时&#xff0c; 使用了 %2s 这个格式串&#xff0c; 之前不是很了解&#xff0c; 尝试后发现&#xff0c; 如果不小…

花上半小时帮你快速熟悉微服务架构

本文将介绍微服务架构和相关的组件&#xff0c;介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景&#xff0c;因此不会涉及具体如何使用组件等细节。 要理解微服务&#xff0c;首先要先理解不是微服务的那些。通常跟微服务相对…

读发布!设计与部署稳定的分布式系统(第2版)笔记02_停飞的代码异常

1. 以前“计划内的停机”很正常&#xff0c;现在则不被接受 2. 高可用性架构 2.1. CF系统不会遇到任何常见的单点失效问题 2.1.1. 硬件的每一部分都有冗余 2.1.1.1. CPU 2.1.1.2. 驱动器 2.1.1.3. 网卡 2.1.1.4. 电源 2.1.1.5. 网络交换机 2.1.1.6. 风扇 2.1.2. 为了…

Redis哨兵模式的配置

1.环境准备 master节点1个slave节点2个sentinel【哨兵】节点3个redis版本5.0.3操作系统&#xff1a;Centos7 2.主从节点配置 创建redis-conf目录&#xff0c;此目录用于存放主从节点的配置文件 复制redis.conf&#xff0c;然后创建三个配置文件&#xff1a;redis-6379.conf&…

循环缓冲题目

题目&#xff1a;一环形缓冲区由 6 个缓冲区 0~5 组成&#xff0c;其中 Full 表示装满数据的缓冲区&#xff0c;Empty 表示空缓冲区。按照顺时针方向&#xff0c;指针 Pf 指向第一个 “满” 缓冲区&#xff0c;指针 Pe 指向第一个 “空” 缓冲区。进程 In 在 Pe 指示下不断向 E…