【python】面向对象程序设计(基础篇)

news2025/7/12 11:44:08

个人主页:天寒雨落的博客_CSDN博客-初学者入门C语言,python,数据库领域博主
💬 热门专栏:python_天寒雨落的博客-CSDN博客

​每日赠语:没有窘迫的失败,就不会有自豪的成功;失败不可怕,只要能从失败中站起来。

一.特点

1.封装

类是一个模板,将多个对象的类似属性放在一个模板中,这就是封装。避免了外部对内部数据的影响,提高了程序的维护性。

2.继承

继承是用来实现代码复用和设计复用的机制,是面向对象程序设计的重要特性之一。设计一个新类时,如果可以继承一个已有的设计良好的类然后进行二次开发,会大幅减少开发工作量。

3.多态

一般是指父类的一个方法在不同派生类对象中具有不同表现和行为。派生类在继承了父类的行为和属性之后,还可能增加某些特定的行为和属性,也可能会对继承父类的行为进行一定的改变,这些都是多态的表现形式。

二、类与对象

1.类的定义

使用class关键字来声明一个类,基本格式如下:

class 类名

        "类体说明"    #类的功能等进行说明

         类成员

         方法成员

类是由3部分组成的:

类的名称:用关键字class声明类,类名首字母一般大写,比如Dog。

类的数据属性:用来存储特征的值(体现对象的特征),简称为成员。如:名字、年龄。

类的方法属性:用来对成员进行操作(体现对象的行为),简称为方法。如:学习、睡觉。

类体说明:对类的功能等进行说明。

2.对象的创建和使用

使用类中定义的成员和方法,必须对类实例化,即创建类的对象,根据类创建实例对象的语法格式如下:

实例名(对象名) = 类名([参数列表] ) 

访问实例成员,可以通过如下方式:

实例名 .成员 实例名 .方法() ,其中“.”叫做成员运算符。

要想给实例添加成员,可以通过如下方式:

实例名.新的成员名 = 值

举例

代码

#定义类.
class Car:
  #定义构造方法.
  def __init__(self,name):
    self.name = name
  #定义方法.
  def getName(self):
    return self.name
#创建对象.
c1 = Car("迈巴赫")
print("这辆汽车的名字:",c1.getName())

执行结果

3.类的成员

1.数据成员

用来存储特征值(体现实例对象的特征)。

2.方法成员

用来对数据成员进行操作(体现实例对象的行为)。

3.成员类型

按照归属于类还是实例对象,类的数据成员可分为两种:

1.类成员

  • 定义在类体中,且在类的所有方法之外的数据成员,类成员属于类本身,一般通过类名.成员名调用,不建议使用“实例名.成员”名调用。

2.实例成员

  • 在类的某个方法中定义的数据成员为实例成员。
  • 实例成员只能通过实例名.成员名被实例对象调用。
  • 实例成员一般在构造方法__init__()中创建,也可以在其他方法中创建。

按照能否在类的外面直接访问,类的成员可分为两种:

1.公有成员

  • 公有成员不以下划线开头,在类的内部可以访问,在类的外部也可以访问

2.私有成员

  •  在类的外部不能直接访问,只能在类的内部访问,或在类的外面通过对象的公有方法访问(不提倡)
  • _xxx:受保护成员(Protected),成员名以单下划线开始,类和派生类可以访问这些成员,在类的外面一般不建议直接访问。
  • __xxx:私有成员(Private),成员名以双下划线开始,不能以两个或更多下划线结束,只有类自己可以访问,子类不能直接访问到这个成员,但在外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。

3.内置成员

 所有的类(无论是系统内置的类还是自定义类)都有一组特殊的成员,其前后各有两个下划线类似:"__xxx__",常见的内置成员如下:

  • __name__:类的名字,用字符串表示。
  • __doc__:类的文档字符串。
  • __bases__:由所有父类组成的元组。
  • __dict__:由类的成员组成的字典。
  • __module__:类所属模块。

注意事项

1.当用对象名调用类成员时, “对象.类成员”只是“类.类成员”的一份拷贝。当修改“对象.类成员”时, “类.类成员”的值不变。

2.当类成员和实例成员同名时:在类的方法内和类的外面,“类名.类成员”调用的是类成员;在类的方法中“self.实例成员” 或在类的外面“对象名.实例成员” 调用的是实例成员。(在类的方法内,和实例成员同名的类成员被屏蔽)

3.定义在类的方法中且不以self为前缀的变量是该方法的局部变量,不能在方法外使用,也不能在类的外面调用。

4.类的方法

1.方法类型

类的方法大致可分为如下四种类型:

  • 公有方法:公有方法的名字不以下画线开头,可以在类的外面通过类名或对象名调用。
  • 私有方法:私有方法以2个或更多下画线开头,可以在类的方法中通过self调用,不能在类的外面直接调用
  • 静态方法和类方法:静态方法和类方法成员可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员,不属于任何对象。相比类方法,静态方法的开销更小。类方法一般以cls作为第一个参数表示该类自身,在调用类方法时不需要为该参数传递值。(静态方法使用装饰器@staticmethod声明     类方法使用装饰器@classmethod声明。)
  • 抽象方法:抽象方法一般定义在抽象类中并要求派生类对抽象方法进行实现。

2.属性

一种特殊形式的方法,结合了成员和方法的各自优点,既可以通过属性访问类中的成员,也可以在访问前对用户为成员提供数据的合法性进行检测,还可以设置成员的访问机制。属性通常包括get()方法和set()方法。前者用于获取成员的值,后者用于设置成员的值。

3.特殊方法

类有大量的特殊方法,其中比较常见的是构造方法__init__()析构方法__del__()

构造方法__init__()

当创建类的实例的时候,系统会自动调用构造方法,用来为类中的成员设置初始值或进行必要的初始化工作,在类实例化时被自动调用和执行。

析构方法__del__()

当删除一个实例对象来释放其所占用资源的时候,Python解释器默认会调用__del__( )方法。

1.构造方法和析构方法都可以由用户自己定义,如果用户没定义,系统会提供默认的构造方法和析构方法。

2.默认的析构方法__del__( )会进行必要的清理工作。

5.类的继承

  • 子类或派生类:在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。
  • 派生类可以继承父类的公有成员,但是不能继承父类私有成员。如果需要在派生类中调用基类的方法,可以使用内置函数super()或者通过“基类名.方法名()”的方式来实现这一目的。
  • Python支持多继承,如果父类中有相同的方法名,而在子类中使用时没有指定父类名,则Python解释器将从左向右按顺序进行搜索。

1.创建派生类

创建派生类的一般格式:

class 派生类名字(父类1,父类2, ...):

        类体

2.举例

代码

#定义People类.
class People:
  #定义构造方法.
  def __init__(self,n,a):
    self.name = n
    self.age = a
  #定义公有方法.
  def speak(self):
    print("我是%s,今年%d岁." % (self.name,self.age))
#定义Student类,继承类People.
class Student(People):
  def __init__(self,n,a,g):
    People.__init__(self,n,a)                 #调用父类的构造方法.
    self.grade = g
  #重写父类的方法.
  def speak(self):
    print("我是%s,今年%d岁,读%d年级." % (self.name,self.age,self.grade))
if __name__ == '__main__':
  #创建Student类的对象.
  s = Student('孔融',10,4)
  s.speak()       		                         #调用Student类中的speak()方法.
  super(Student,s).speak()                    #调用父类People的speak()方法.

运行结果

 

注意事项

  • 派生类可以只继承一个父类(单继承)
  • 派生类也可以继承多个父类(多继承)
  • 派生类调用父类方法,可用super.方法名()父类名.方法名()
  • 派生类可以继承父类的成员和方法,也可以定义自己的成员和方法。
  •  如果父类方法不能满足要求,派生类也可以重写父类的方法

6.类的多态

一般是指父类的一个方法在不同派生类对象中具有不同表现和行为。

举例

代码

#定义类Animal.
class Animal():
  #定义方法.
  def getInfo(self):
    return "I am an animal."
#定义类Lion,继承类Animal.
class Lion(Animal):
  #重写父类Animal的方法getInfo().
  def getInfo(self):
    return "I am a lion."
#定义类Tiger,继承类Animal.
class Tiger(Animal):
  #重写父类Animal的方法getInfo().
  def getInfo(self):
    return "I am a tiger."
#定义类Leopard,继承类Animal.
class Leopard(Animal):
  #重写父类Animal的方法getInfo().
  def getInfo(self):
    return "I am a leopard."
if __name__ == '__main__':
  #创建各个类的对象列表objectList.
  objectList = [item() for item in (Animal,Lion,Tiger,Leopard)]
  #不同对象调用同一方法getInfo().
  for object in objectList:
    print(object.getInfo())

执行结果

7.抽象类和抽象方法

Python中一般使用抽象基类(Abstract Base Class,ABC)来实现抽象类。

1.特点

抽象类中通常包含抽象方法(没有实现功能),该类不能被实例化,只能被继承,且派生类必须实现抽象类中的抽象方法。

2.举例

代码

import abc
#定义抽象类.
class People(metaclass=abc.ABCMeta):
  #定义抽象方法.
  @abc.abstractmethod
  def working(self):
    pass
#定义抽象类People的派生类.
class Chinese(People):
  #实现抽象类的抽象方法working().
  def working(self):
    print("学习汉语…")
#创建Chinese类的对象.
c1 = Chinese()
c1.working()

执行结果

 👍+✏️+⭐️是对博主最大的鼓励与支持!!!

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

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

相关文章

浅识vue的虚拟DOM和渲染器

虚拟DOM本质上是对DOM的抽象描述,就是一个普通的js对象。他身上的属性要比真实DOM的属性要少得多。 在一定情况下,使用虚拟DOM的性能要逊于直接使用真实DOM。 例如,在页面一开始的时候,Vue需要先通过生成虚拟DOM树,在…

【雷达通信】雷达探测项目仿真附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

《恋上数据结构与算法》第1季:链表原理实现(图文并茂)

数据结构与算法的学习笔记目录:《恋上数据结构与算法》的学习笔记 目录索引链表原理实现一、链表二、链表的设计三、链表的接口设计四、链表接口的实现1. 索引越界的判断2. 根据索引查找指定节点3. 添加数据4. 插入元素5. 删除元素6. 清空元素7. 修改元素8. 查找元素…

傻白入门芯片设计,RDL/Interposer/EMIB/TSV(三)

目录 一、再分配层(RDL) 二、硅中介层(Si Interposer):Active and Passive 三、嵌入式硅桥(EMIB) 四、硅通孔 TSV(Through Silicon Vias) 一、再分配层(R…

CCF CSP认证2022年6月 归一化处理、寻宝!大冒险!、光线追踪

这是我第一次参加了这次CSP考试,300分,写了124三题,模拟题到现在都没看过题面没看,笑,t4写成模拟加数据结构,200行,因为一个小错误调了1h,错失了大好机会。考试环境的VSC配置的字体太…

[一篇读懂]C语言十讲:单链表的新建、查找

[一篇读懂]C语言十讲:单链表的新建、查找1. 与408关联解析及本节内容介绍1 与408关联解析2 本节内容介绍2. 头插法新建链表实战3. 尾插法新建链表实战4. 按位置查找及按值查找实战5. 往第i个位置插入元素实战6. 链表的调试方法总结234561. 与408关联解析及本节内容介…

面对无法投入模型训练的object类型数据在头疼,快来使用我的丝滑小连招

面对无法投入模型训练的object类型数据在头疼,快来使用我的丝滑小连招 前言 丝滑小连招 tip1- get_dummies完美one-hot(str->int) tip2 - rename_dims解决重名问题! tip3 - insert且drop!​​​​​​​ 前言 我…

小爱同学控制美的美居中的家电热水器,空调等

背景 家里大多数家电都是支持接入米家App的,美的家电不能接入小米,电脑安装Home Assistant成功实现小爱语音控制美的燃气热水器。 实现步骤: 1. 安装docker 我的电脑是windows的,那就直接安装docker desktop https://desktop.…

【Linux】基础指令(三) —— 收尾篇

文章目录前言zip 和 unzip 指令tar 指令bc 指令uname 指令history关机热键补充ctrl c↑ && ↓ctrl rctrl d指令拓展结语前言 今天为大家带来的是最后一部分基础指令讲解。主要内容为 7个指令讲解、热键补充、简单提一下指令的拓展 。内容相对之前较少,更…

服务器密码以及用户名怎么修改

服务器密码以及用户名怎么修改 我是艾西,今天给大家说下服务器密码如何修改 windows2003系统: 1、右键我的电脑,点击“管理”: 2、在“本地用户和组”中打开“用户”,在右侧找到 Administrator 账户进行修改。 200…

【linux】linux实操篇之任务调度

目录前言crond 任务调度概述基本语法快速入门案例案例一:每隔一分钟将ls -l /etc/ 追加到 /tmp/to.txt 文件案例二:每隔一分钟执行python文件结语前言 我们常用linux做一些定时任务,最常见的就是在服务器领域,我们常常做一些定时…

高分辨率格式理论

一个核心概念:人工粘性 考虑经典的双曲守恒律方程 ∂u∂t∂f∂x0{{\partial u} \over {\partial t}} {{\partial f} \over {\partial x}} 0∂t∂u​∂x∂f​0 可以写成守恒形式的数值格式 uin1uin−λ(f^i1/2n−f^i1/2n)u_i^{n 1} u_i^n - \lambda \left( {\ha…

基于ssm+mysql+jsp学生成绩管理系统(含实训报告)

基于ssmmysqljsp学生成绩管理系统(实训报告)一、系统介绍二、功能展示1.学生信息查询2.学生信息添加3.学生信息修改4.学生信息删除四、获取源码一、系统介绍 系统主要功能:系统实现了学生信息查询、添加、修改、删除。 环境配置: Jdk1.8 M…

[附源码]java毕业设计智慧教学平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

储能辅助电力系统调峰的容量需求优化配置matlab/cplex

参考文献:储能辅助电力系统调峰的容量需求研究 摘要:建立了储能辅助电力系统调峰的容量需求优化配置模型,设置了含储能和不含储能两种仿真方案,将两个算例代入所提模型进行求解,得到最优的储能系统容量和功率配置&…

Flutter高仿微信-第52篇-群聊-清空聊天记录

Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图: 实现代码: //清空聊天记录对话框 void _cleanGroupChatDialog(){Lo…

【Python】数据类型 + 运算符 + 输入输出

文章目录一. 常量和表达式二. 变量和类型1. 什么是变量2. 变量的语法2.1 定义变量2.2 使用变量3. 变量的类型3.1 整数3.2 浮点数3.3 字符串3.4 布尔3.5 关于变量类型的几点补充三. 注释1. 什么是注释?2. 为什么要有注释?3. 如何写注释?3.1 注…

深度学习制作自己的数据集—为数据集打上标签保存为txt文件,并进行划分和加载数据集

目录 0 前言 1 为图片数据集打上标签并保存为txt文件 2 将txt文件中的图片标签数据集随机划分为训练集和测试集 3 加载txt文件中的图片标签数据集 0 前言 目前是被封控的第四天了,只能呆在宿舍不能出去,记得上次这样子还是一年前大四快毕业那时候了……

CyberController手机外挂番外篇:源代码的二次修改

文章目录前言调试过程中的疑问为什么一段时间不使用CyberController,翻译就无法触发了?为什么连接成功了,但却依然无法进行语音识别和翻译?多长时间TCP连接就会挂掉连接正常与断开连接有什么区别?不停进行翻译&#xf…

现代密码学导论-18-伪随机置换

目录 伪随机置换 PROPOSITION 3.26 伪随机置换和伪随机函数的关系 DEFINITION 3.27 强伪随机置换 伪随机置换 我们称F是含参数k的置换,当且仅当 且对于所有k, Fk是一对一的,即是满射的。 其中 lin 称为F的块长度 对于给定的 k、x和k、y&…