Pytho07--面向对象2

news/2024/5/15 21:35:50/文章来源:https://blog.csdn.net/weixin_53046747/article/details/127242424

之前我们已经知道了面向对象的概念及在python中创建空类,带方法的类,带初始化方法的类,带实例化方法的类等并认识了类的成员。在我们将其与Java的代码进行对比后发现了python确实有它的方便之处。面向对象的内容不止之前文章中提到的那些,我们需要进行在面向对象这篇神奇的国度继续去探索和遨游。~·~~~~~~~·~ 

现在我们接着进一步认识python中的面向对象。

目录

一,私有成员

1,对比公有属性和私有属性的定义和访问:

 2,对比公有方法和私有方法的定义和访问

3,使用公有方法访问私有成员 

二,封装

三,继承

1,单继承 

1)python中实现单继承

2)java中实现单继承 

2,多继承

1)python中实现多继承

2)Java中实现多继承


一,私有成员

我们创建的类成员默认都是公有成员,可以在类的外部通过类或对象随意访问,这样显然不够安全,因为什么类都可以来访问我们的成员,那么它们就极有可能在外部就可以改变我们的成员,并修改里面的数据,所以为了我们数据的安全性,在创建类的时候都会定义一些私有的类成员来存储不想对外公开的数据,在一定程度上限制在类的外部对类成员的访问。在Java中的私有化成员都是使用private,protect等关键字进行修饰的,但是在python中,它是通过在类成员的名称前面添加双下划线__的方式来表示该成员为私有成员。

接下来我们使用具体的代码来看一下私有成员的定义和使用及效果(与公有成员进行对比):

1,对比公有属性和私有属性的定义和访问:

 现在我们先声明两个类属性,并给公有的类属性name赋一个初始化的值, “BigData”,以及一个私有化的类属性__age,并给一个初始化的值24。

class TestClass:name="BigData"  # 公有类属性__age=24    # 私有类属性
object1=TestClass()
print(object1.name)  # 对象访问公有属性
print(object1.age)   # 对象访问私有属性

 2,对比公有方法和私有方法的定义和访问

如下,我们在类里面声明两个实例方法,两个实例方法最根本的区别在于一个是公有的say(),另外一个是私有的__secret()。 

class TestClass:def say(self):  # 公有实例方法print("hello")def __secret(self):  # 私有实例方法print("有内鬼,停止交易")
object1=TestClass()  # 创建对象
object1.say()  # 对象调用公有实例方法
object1.secret() # 对象调用私有实例方法

3,使用公有方法访问私有成员 

 从上面我们可以看到,如果我们在类的外面创建了一个对象来调用我们的私有化的类成员的话都会显示没有这个属性,这样子保证了我们的一些数据的安全性,就不是随随便便一个对象就能够进行访问的。但是如果如果我们想要去调用的话又该怎么去编写我们的代码呢?

之前我一直以为书上的概念:私有属性和方法只能在类中访问。是直接在类中打印或者是输出该属性,结果并不是,而是需要在含有私有化属性或者是方法的类体中创建一个公有的方法(该公有方法可以调用我们的私有属性和方法),然后在类的外部创建一个对象,该对象可以来调用包含有私有属性和方法的公有方法,来实现打印和输出我们的私有属性和方法的功能,如下:

class TestClass:__age=24def say(self):  # 公有实例方法print("hello")def __secret(self):  # 私有实例方法print("有内鬼,停止交易")def public_contain(self):print(self.__age)  # 访问私有类属性self.__secret()  # 调用私有实例方法
object1=TestClass()  # 创建对象
object1.public_contain()  # 调用包含有私有成员的公有方法

 如上,我们可以看到,成功访问到了私有属性和调用了私有方法。

二,封装

封装和我们之前认识的定义私有成员的作用有点类似,都是为了保证类内部的数据的安全。但是我们的封装并不是值属性或者是方法的私有化,而是在编写初始化方法(构造方法)的时候直接将我们的属性声明为私有属性,并添加2个可供类外部调用的公有方法,分别用于设置或获取私有属性的值,多想不如多敲代码,现在我们使用代码来看一下具体的实现和效果:

class TestClass:def __init__(self,name):  # 构造方法self.__age=24   # 私有属性age,默认为24self.name=name  # name变量属于调用该方法的对象def  set_age(self,age):  # 设置私有属性值的方法if(age<0):print("您的年龄不合法")else:self.__age=age  # 如果年龄合法就想该年龄赋值给调用的对象def get_age(self):  # 获取私有属性的方法return self.__age
object1=TestClass("张三")
object1.set_age(20)  # 对象调用设置私有属性的方法来修改私有属性
print("%s的年龄为%s" % (object1.name,object1.get_age()))

 当我们输入的年龄不合法(年龄为负数)时,就不会将对象修改的内容添加进去,而是打印输出提示:“您的年龄不合法”,并使用类属性默认的age属性值24.

从开始到现在,不知道大家有没有发现我们的对象实例化及打印输出对象并没有写在main方法中,但是却可以实例化成功我们的对象及打印输出出我们想要的内容,这是为什么呢?究其原因主要是因为我们的python它是个脚本语言,在运行程序的时候它自己会启动一个线程,也不一定需要main方法的存在,它就可以在文件中进行对象的实例化,方法调用等操作。

但是实际上这种方式并不规范,我们的文件都需要有一个main方法入口,最为主函数的形式存在,不管是对象的实例化,方法的调用,还是线程的开启,都需要在main方法中书写,咱写代码要规范地去编写,还是在main方法中比较好。

我们修改代码后如下所示:

接下来我们去认识面向对象中的另外一个概念:继承

三,继承

1,单继承 

1)python中实现单继承

在支持面向对象编程思想的计算机语言中,继承是一个很不错的东西,它支持我们代码的复用(重用),减少了我们对同一个功能的代码进行重复编写,费时费力。并且继承还可以分为单继承和多继承【根据子类继承父类的多少进行划分:如果继承了一个父类则为单继承,两个或者是两个以上则为多继承】,现在我们先来认识python中的单继承,在python中的继承不像Java中那样,需要写上关键字extends,我们只需要在类名后面带上一个小括号并在里面写上我们的父类即可,如下:

现在我们将使用这个继承了TestClass的子类来创建一个对象,并调用父类重写的toString方法: 

class TestClass:def __init__(self, name):  # 构造方法self.name = name  # name变量属于调用该方法的对象__age = 24  # 私有化的实例属性def set_age(self, age):  # 设置私有属性值的方法if (age < 0):print("您的年龄不合法")else:self.__age = age  # 如果年龄合法就想该年龄赋值给调用的对象def get_age(self):  # 获取私有属性的方法return self.__agedef __str__(self):  # 重写toString方法return f"TestClass [name=' {self.name}  ', age={self.__age}]"class SubClass(TestClass):  # SubClass类继承TestClass类pass  # 因为继承了一个父类,所以类体里面不需要写上具体的类成员if __name__ == '__main__':sub_object1 = SubClass("子类一号")  # 使用空类(已经继承了TestClass类)创建对象sub_object1.set_age(99)print(sub_object1.__str__())

如上我们可以看到即使一个空类里面什么都没有,但是它可以通过继承机制去继承一个父类(基类/超类)来获得类成员并实现相同的功能,而不需要再去写相同的代码。 那么在Java中又该如何去体现继承呢?

2)java中实现单继承 

 如果我们要到Java中去实现类之间的继承的话,就需要使用到extends关键字,并如下编写代码:

public class ExtendDemo1 {String name;private int age;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public ExtendDemo1(){ }  // 无参构造方法@Overridepublic String toString() {return "ExtendDemo1 [name=" + name + ", age=" + this.getAge() + "]";}public static void main(String[] args) {Sub_ExtendDemo1 sub_object01=new Sub_ExtendDemo1();  // 使用父类的无参构造方法创建对象sub_object01.name="子类一号";  // 从父类那继承来的name属性sub_object01.setAge(100);  System.out.println(sub_object01.toString());}
}
// 子类(派生类)
class Sub_ExtendDemo1 extends ExtendDemo1{ }  // 继承了ExtendDemo1的空类

 我们可以看到python的继承和Java的继承机制都是大同小异的,创建的子类都可以去调用父类的方法或者是访问父类的属性(公有的)。

2,多继承

多继承的案例在我们的生活中也有很多,比方说车子+房子=房车,电脑+手机=平板,椅子+床=躺椅,驴+马=骡等。

毫无疑问的是,根据前两者事物结合而成的事物更加优良。我们这里就拿躺椅来作为例子进行多继承案例分析:

1,椅子是拿来坐的,不能实现睡觉的功能

2,床只能在家里面睡,并不能放到办公室来睡(首先空间不足,其次就是还得需要整理),因此也没有椅子可以拿来放在办公室坐的功能。

3,于是就有富有创造性的人想到了躺椅,既有椅子可以坐的功能,又有像床一样可以躺着休息睡觉的功能。

现在我们编写代码来表示这些内容。

1)python中实现多继承

python中的多继承可以像之前实现单继承那样,直接往我们的类名后面的括号里面传入子类要继承的父类(基类/超类)即可,只不过这一次我们需要传入的是多个父类,如下:

class Chair(object):  # 基类def cansit(self):print("可以用来坐")
class Bed(object): # 基类def cansleep(self):print("可以用来躺")
class DeckChair(Chair,Bed):  # 继承了两个基类的子类pass  # 空类
if __name__ == '__main__':deck_chair=DeckChair()  # 创建躺椅对象deck_chair.cansit()  # 调用椅子可以坐的功能deck_chair.cansleep()  # 调用床可以躺的功能

 如上,我们可以看到,躺椅同时具备了椅子和床的功能。但是有些时候椅子和床的功能会有一样的地方即存在同名的功能,我们可以思考一下,这个时候我们的躺椅会先调用哪个父类的同名的功能呢?

答案是:子类先继承哪个类,就会先调用哪个类的方法。例如我们的躺椅先继承的是椅子,如果椅子里面存在一个方法soft()和床类中的soft()方法同名,那么躺椅就会只调用椅子中的soft方法:

class Chair(object):  # 基类def cansit(self):print("可以用来坐")def soft(self):print("椅子是软底的")
class Bed(object): # 基类def cansleep(self):print("可以用来躺")def soft(self):print("床是软底的")
class DeckChair(Chair,Bed):  # 继承了两个基类的子类pass  # 空类
if __name__ == '__main__':deck_chair=DeckChair()  # 创建躺椅对象deck_chair.cansit()  # 调用椅子可以坐的功能deck_chair.cansleep()  # 调用床可以躺的功能deck_chair.soft()  # 调用父类中同名的方法

 如上我们可以看到,调用的是Chair类(子类先继承的类)中的soft方法。通过如上代码,我们可以知道,在python中的多继承只需要在单继承的基础上多传入了几个类而已,但是另外另外一个使用了面向对象编程思想的计算机语言:Java,它来实现多线程就不是那么简单的事情了。

接下来我们使用Java语言,跟python进行对比,看一下它们之间实现多继承的区别。

2)Java中实现多继承

在Java中并不存在多继承的概念,我们只能通过实现接口的形式来实现多继承的功能。如下:

 文件:

I_Chair.java

public interface I_Chair {  // 椅子类接口public abstract void cansit();  // 抽象方法
}

 I_Bed.java

public interface I_Bed {  // 创建床类接口public abstract void cansleep();  // 抽象方法
}

DeckChair.java

public class DeckChair implements I_Chair,I_Bed  {   // 创建躺椅类并让其实现椅子接口和床类接口@Overridepublic void cansleep() {  // 重写床接口的抽象方法// TODO Auto-generated method stubSystem.out.println("可以用来躺");}@Overridepublic void cansit() {  // 重写椅子接口的抽象方法// TODO Auto-generated method stubSystem.out.println("可以用来坐");}public static void main(String[] args) {DeckChair dc=new DeckChair();  // 创建躺椅对象dc.cansit();  // 调用重写的椅子接口的抽象方法dc.cansleep();  // 调用重写的床接口的抽象方法}
}

 如上,我们可以看到,在Java中需要使用先定义两个接口,之后再去创建一个类来实现它们。

以上就是继承的简单了解,因为在python中的使用到继承的地方也就是这些东西,知道怎么去让一个类继承另外一个类,并且能够使用父类(超类/基类)的类成员,以及能够通过父类提供的公有方法去访问私有成员就行,如果以后我遇到了更加复杂的继承相关的使用的话,会再进一步的补充该博客的内容。

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

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

相关文章

IDEA+Tomcat——前端输入数据乱码问题

IDEATomcat——前端输入数据乱码问题 给别人远程部署项目的时候&#xff0c;发现比较老的项目会出现接收前端数据是乱码的问题&#xff0c;但这个项目在我自己的电脑上却是正常的&#xff0c;通过对比发现&#xff0c;IDEA版本或Tomcat版本不同及过低是造成此问题的主要原因&am…

【数学与算法】最小生成树Spanning Trees

链接 无向图&#xff1a; 无向图的意思是&#xff0c;边没有方向。 树&#xff1a; 树是一类特殊的图&#xff0c;树是由节点和无向边构成的&#xff1b; 所有的树都是无向图&#xff0c;但是无向图未必是树&#xff1b; 树有一些性质&#xff0c;但并非所有图都有这些性质…

webrtc防抖动策略NetEq

什么是NetEq:进行抖动控制和丢包隐藏,让音频更平滑。 NetEq的位置 消除抖动的基本原理 NetEq整体架构 NetEq用到的几种缓冲区 NetEq的MCU与DSP NetEq的位置: 网络抖动的计算方式: 两个包在发送端的时间间隔为S,在接收端的间隔为R,那么抖动为J=S-R。 NetEq缓冲区设置多…

golang中struct

前面已经介绍的数组&#xff0c;slice,map有一定的相同之处&#xff0c;即处理的都是相同类型的元素&#xff0c;map中的key和value属于相同的类型&#xff0c;但如果要把多个类型的元素放到一起进行处理&#xff0c;则要使用go语言为我们提供的数据结构struct struct非常适合定…

【Arcgis操作】模块化(批量、自动化)计算多个图层的面积

有很多个图层的面积要计算&#xff0c;如果采用普通的方法&#xff0c;需要给每个图层添加【字段】&#xff0c;然后再挨个计算&#xff0c;图层少的话还好&#xff0c;图层太多的话&#xff0c;很麻烦&#xff0c;很累。 那么&#xff0c;有没有一种方法&#xff0c;能够批量…

OpenCV-Python学习(7)—— OpenCV 轨迹栏操作和键盘响应操作

1. 知识点 cv.namedWindow() 创建一个窗口&#xff1b;cv.createTrackbar() 创建一个轨迹栏&#xff1b;cv.getTrackbarPos() 获取对应轨迹栏的轨迹位置&#xff1b;cv.waitKey() 键盘操作返回对应的key。 2. cv.namedWindow() 函数说明 函数使用 cv.namedWindow(winname, …

【每日算法题】最后一个单词的长度(简单)

今天开始学一学算法✨&#xff0c;前两天研究了下算法&#xff0c;发现算法和数据结构是程序的灵魂&#xff0c;这句话可真没错。 今天先从简单的开始吧&#x1f601;&#xff0c;LeetCode 第 58 题&#xff1a;最后一个单词的长度 题目&#xff1a;给你一个字符串 s&#xf…

Linux下使用WPS做office的二次开发

Linux下使用WPS做office的二次开发 序 上个版本WPS在Linux上就已经支持二次开发了&#xff0c;可以直接去看官网相关的介绍。https://open.wps.cn/ 我们选择WPS的客户端进行二次开发 开发环境 Ubuntu18.04wps-office_11.1.0.9126_amd64.debQt的开发环境&#xff08;我本地…

REACT全家桶(1)

基础 一、特点 声明式设计 高效 减少dom操作 灵活 JSX JS拓展语法 组件 单向响应的数据流 二、虚拟DOM 把真实DOM树转成对象树&#xff0c;再通过diff算法&#xff0c;减少重绘与回流 三、搭建环境&#xff08;提前安装node环境&#xff09; 1.全局安装create-rea…

《图解 HTTP 》阅读笔记(三)

书接上文《图解 HTTP 》阅读笔记&#xff08;二&#xff09;&#xff0c;我们继续探索总结http的相关知识点。 我们还是先把问题摆到台面&#xff0c;带着问题读文章。 6.第九章&第十章 知识点 6.1 HTTP的瓶颈以及相应解决方案 HTTP优缺点分析的时候&#xff0c;我们是相对…

ELK+Filebead+zookeeper+kafka部署

目录 一、为什么要做日志分析平台&#xff1f; 二、ELKFilebeatKafkaZookeeper架构 三、搭建ELKFilebeatKafkaZookeeper 1、3台机子安装zookeeper 192.168.100.14/15/16 1.1 解压安装zookeeper软件包 1.2 修改Zookeeper配置配置文件 1.3 设置myid号以及启动脚本 1.4 3…

【前端修炼场】— 网页到底是添加超链接的呢

此文为【前端修炼场】第六篇&#xff0c;上一篇文章链接&#xff1a;img 标签 文章目录前言一、超链接引入二、属性值介绍2.1 href 属性值2.1.1 在同一文件路径下跳转2.1.2 跳转任意网址2.2 title 属性值2.3 target 属性值总结前言 本篇文章我将带领诸位学习如何在页面中添加超…

GitHub 供应链安全已支持 Dart 开发者生态

通过 Dart 和 GitHub 团队的共同努力&#xff0c;自 10 月 7 日起&#xff0c;GitHub 的 Advisory Database (安全咨询数据库)、Dependency Graph (依赖项关系图) 和 Dependabot (依赖更新机器人) 开始支持 Dart 开发者生态&#xff0c;这也意味着 GitHub 为 Dart 和 Flutter 应…

单商户商城系统功能拆解13—分类管理

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

LNMP网站架构

LNMP网站架构 文章目录LNMP架构简介LNMP是什么&#xff1f;LNMP架构的优点LNMP与LAMP的区别LNMP的工作原理知识拓展FastCGINginxFastCGIPHP-FPM搭建LNMP架构部署Nginx部署MySQL部署PHP连接nginx与phpnginx配置php配置LNMP架构简介 LNMP是什么&#xff1f; LNMP是Linux系统下N…

智能CDN(下):CDN的未来发展方向

一、中心思想&#xff1a; 利用CDN网络来发布域名的DNS记录&#xff0c;承载域名解析服务器的功能&#xff0c;即CDN网络中的智能CDN服务器可以直接返回给客户边缘节点CDN服务器的IP网址。 二、发展方向&#xff1a; 首先&#xff0c;CDN的重定向技术是根据域名解析服务器的…

基于FT2000+模块PS1600国产40G网卡验证说明

1、背景介绍 由于全国产化需求&#xff0c;需要在飞腾平台上使用PS1600 40G网卡替换Mellanox CX5&#xff0c;平台内部还是使用CTC8096作为交换芯片&#xff0c;示意框图如下&#xff1a; 2、交换配置 CTC8096需要将与PS1600相连的端口改为自协商关闭&#xff0c;否则无法lin…

通信协议——IIC详解

I2C协议物理层原理 总体特征 电气限制协议层起始和停止条件 数据有效性 响应/应答 寻址 读数据 写数据单片机通讯软件模拟 硬件外设(一)物理层1. 原理 I2C 总线,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。 通信原理是通过对SCL和SDA线高低电平时序的控制,来 …

mybatis-plus 使用技巧

下面是基本的环境 1.数据库有一张表 &#xff08;我先当mybatis设计表&#xff09; 2.控制层&#xff0c;持久层&#xff0c;服务层 &#xff0c;配置类准备好 如下 配置类&#xff1a; 插件可以不配置&#xff0c;看需求 /*** author Royalreairman* create 2022-08-06 20:3…

Dubbo介绍及整合Springboot及zookeeper注册中心

一、Dubbo介绍 1、定义 Dubbo是由阿里巴巴开源的一个高性能、基于Java开源的远程调用框架。正如在许多RPC系统中一样&#xff0c;Dubbo是基于定义服务的概念&#xff0c;指定可以通过参数和返回类型远程调用的方法。在服务器端&#xff0c;服务器实现这个接口&#xff0c;并运…