当前位置: 首页 > news >正文

解锁面向对象编程:Python 类与对象详解

🏠大家好,我是Yui_💬
🍑如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🚀如有不懂,可以随时向我提问,我会全力讲解~
🔥如果感觉博主的文章还不错的话,希望大家关注、点赞、收藏三连支持一下博主哦~!
🔥你们的支持是我创作的动力!
🧸我相信现在的努力的艰辛,都是为以后的美好最好的见证!
🧸人的心态决定姿态!
💬欢迎讨论:如有疑问或见解,欢迎在评论区留言互动。
👍点赞、收藏与分享:如觉得这篇文章对您有帮助,请点赞、收藏并分享!
🚀分享给更多人:欢迎分享给更多对编程感兴趣的朋友,一起学习!

python从设计之初就是一门面向对象的语言,它提供一些语言特性支持面向对象编程。那么第一个问题就是什么是面向对象。

文章目录

  • 1. 什么是面向对象
  • 2. 面向对象术语介绍
  • 3. 类的定义与使用
    • 3.1 类的定义
    • 3.2 self用法解释
    • 3.3 类属性和实例属性
      • 3.3.1 类属性
      • 3.3.2 实例属性
    • 3.4 实例方法、类方法
      • 3.4.1 实例方法
      • 3.4.2 类方法
  • 4.总结

1. 什么是面向对象

面向对象( Object-Oriented Programming)是现代编程语言都存在的一种编程方式,如果你使用过C语言会发现,每当需要实现一个功能时都需要创建一个一个的函数来实现,这是面向过程。如果你使用过C++或者JAVA就会发现,当实现一个功能时,会把这个功能需要的属性和函数抽象出来封装成一个整体,程序员再对这个整体进行操作,这个整体也就叫做类,类实例出的东西叫做对象。
下面贴上维基百科)的解释:
面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是种具有对象概念的编程典范,同时也是一种程序开发的抽象方针。它可能包含数据、特性、代码与方法。对象则指的是类(class)的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性,对象里的程序可以访问及经常修改对象相关连的数据。在面向对象程序编程里,计算机程序会被设计成彼此相关的对象。
面向对象程序设计可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。
当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。许多流行的编程语言是面向对象的,它们的风格就是会透由对象来创出实例。

2. 面向对象术语介绍

在正式具体介绍面向对象技术前,我们需要先了解一些面向对象的术语,以便在后续内容中能够明白对应的意思。

  • 类:用于描述具体相同属性和方法的对象的集合。类定义了集合中每个对象共有的属性和方法。对象是类的实例。
#基本语法
class MyClass:#类的属性#类的方法
  • 类变量(类属性):类变量在整个实例化的对象中是公用的。类变量定义在类中,且在方法之外。类变量通常不能作为实例变量使用。类变量也称为类属性(类似于Java的static的)。
class Person:species = "Human" #类属性
print(Person.species) #访问类属性
  • 数据成员:实例属性是对象独有的,通过self关键字定义
  • 方法重写:如果从父类继承的方法不能满足子类的需求,就可以对可以对其进行改写,这个过程称为方法的覆盖(Override),也称为方法的重写。
  • 实例变量(实例属性):定义在方法中的变量只作用于当前实例的类。
class Person:def __init__(self,name,age):self.name = name #实例属性self.age = age #实例属性
person1 = Person('Yui',17)
person2 = Person('Yamada',14)
print(person1.name) #输出:Yui
print(person2.name)
  • 封装(Encapsulation):对外部世界隐藏对象的工作细节。
  • 继承(Inheritance):一个派生类(derived class)继承基类(base class)的字段和方法。继承允许把一个派生类的对象作为一个基类对象对待,以普通类为基础建立专门的类对象。
  • 多态(Polymorphism):对不同类的对象使用相同的操作。
  • 实例化(Instance):创建一个类的实例、类的基础对象。
  • 方法:类中定义的函数。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
    python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类、派生类可以覆盖基类中的任何方法、方法中可以调用基类中的同名方法。
    对象可以包含任意数量和类型的数据。

3. 类的定义与使用

3.1 类的定义

定义一个类:

class Person(object):#属性species = "Human" #类属性#初始化方法def __init__(self,name,age):self.name = name #实例属性self.age = age#方法def introduce(self):print(f'My name is {self.name}, and I am {self.age} years old.')

从这段代码可以看出,定义类时需要使用到关键字class,注意在给类取名时应该做到每个单词的首字母大写,其它字母小写。可以看到Person后面紧接着object代表着该类继承于object,我们要知道所有类都继承自object,所以这个object继承是可以省略的。
注意,无论是类属性还是类方法,对应类来说,它们都不是必须的,可以有也可以没有。另外,python类中的属性和方法所在的位置也是任意的,也就是说,它们是没有固定的前后顺序的。
关于__init__、self,如果你又学过C++/java可以把它们分别理解为构造函数和this指针。关于它们的具体介绍会在文章后面介绍。

3.2 self用法解释

了解完类的定义就可以简单地使用类了。

class MyClass:i = 111def f(self):return 'hello wrold'
use_class = MyClass() #类的实例化
print('调用类的属性:',use_class.i)
print('调用类的方法:',use_class.f())

关于self
在上面的示例中,类中定义了应该f()方法中带有了应该self参数,可是我们并没有传入参数,那么它有什么作用呢?
self 是类中的实例方法的第一个参数,用于指代当前对象的引用。通过 self,可以访问当前对象的属性和方法。虽然名字不固定,但通常约定俗成地使用 self
等价的代码:

MyClass.f()
#等价于:
MyClass.f(MyClass)

那么为什么需要self的存在呢?
它的作用主要就是用来标识特定的对象的,在学习面向对象的时候,许多老师都会把类比作成一张图纸(你可以理解为房屋设计的图纸),利用这个图纸,你可以设计出许多的房屋(也就是类对象),每个房子的长相都是类似的(都有相同的类变量和类方法),但是尽管它们一样,但是它们的主人是不一样的,也就导致了这些房间的门锁不同。
self它就相当于每个房间的门钥匙,可以保证每个房间的主人仅能进入自己的房间(每个类对象只能调用自己的类对象和类方法)。
就像前面的代码:

MyClass.f()
#等价于:
MyClass.f(MyClass)
#保证每个类对象只能调用自己的类对象和类方法

同一个类可以产生多个对象,当某个对象调用类方法时,该对象会把自身的引用作为第一个参数自动传给该方法,也就是说,python会自动绑定类方法的第一个参数指向该方法的对象。这样的话,python解释器就知道到底要操作哪个对象的方法了。
因为,self编译器会自动调用,所以在代码书写的过程中,不需要显示写出来。

class MyClass:def __init__(self):print('我是构造方法')def run(self):print(self,'我是run方法')test1 = MyClass()
test1.run()
test2 = MyClass()
test2.run()

打印结果:`

我是构造方法
<__main__.MyClass object at 0x000001FF12F37380> 我是run方法
我是构造方法
<__main__.MyClass object at 0x000001FF12F373B0> 我是run方法

从打印结果来看,这两个实例出的对象确实是不同的,两个对象打印的self是不同的。
run()中的self代表该方法的调用者,谁调用该方法,那么self就代表谁。

3.3 类属性和实例属性

在前面的内容里。我们简单的了解了下类属性和实例变量。
无论是类属性还是类方法,都是无法像普通变量或者函数那样,在类外直接使用它们。因为类中的方法和属性都被封装起来了。类就是一个独立的空间,类属性就是类中定义的变量,类方法也是累中定义的函数
通过总结,我们可以吧类属性分为以下3种类型。

  1. 类体中、所有函数之外:此范围定义的变量,称为类属性或类变量。
  2. 类体中,所有函数内部:以self.变量名的方式定义的变量,称为实例属性或者实例变量。
  3. 类体中,所有函数内部:以self=变量名的方式定义的变量,称为局部变量。

此外还有实例方法、静态方法和类方法,在后续内容中出现。

3.3.1 类属性

类属性是在类中,但是在各个类方法外定义的变量。

#类变量演示class Person:name = '小明'age = 18weight = 70if __name__ == '__main__':print(Person.name)print(Person.age)print(Person.weight)#打印结果:
'''
小明
18
70
'''

可以看到,我们并没有实例化出对象,但是这些变量依旧可以正常访问。
这一现象说明了,类变量是作为公共资源存在的,为所有实例化出的对象所公用,所有即使不实例化出对象依旧可以访问类属性。
改写代码:

class Person:name = '小明'age = 18weight = 70if __name__ == '__main__':print(Person.name)Person.name = "小红"print(Person.name)
'''
小明
小红
'''

可以看到类名不仅可以调用类变量,也可以修改它的值。
值得一提的还有:除了可以通过类名访问类变量外,还可以动态地为类和对象添加类变量。如下:

class Person:name = '小明'age = 18weight = 70if __name__ == '__main__':print(Person.name)Person.name = "小红"print(Person.name)Person.xixi = 100print(Person.xixi)

3.3.2 实例属性

实例属性指的是在任意类方法内部,以self.变量名的方法定义的变量,特点在于作用于调用方法的对象。
注意:实例变量只能通过对象访问,无法通过类名访问。

class Person:def __init__(self):self.name = 'yui'self.age = 18def say(self):self.test = 100if __name__ == '__main__':p = Person()print(p.name)print(p.age)#print(p.test) 报错p.say()print(p.test)
'''
yui
18
100
'''

由于init()函数在创建类对象时会自动调用,而say()方法需要我们手动调用。因此造成了直接调用name和age没有问题,而在调用了say()函数前,test是无法调用的。

3.4 实例方法、类方法

和类属性一样,类方法也可以进行更细致的划分,具体可分为类方法、实例方法和静态方法。

和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。

3.4.1 实例方法

默认情况下,在类中定义的方法都是实例方法。

class Person:def __init__(self):self.name = 'yui'self.age = 18def say(self):print("%s is %d years old" % (self.name, self.age))if __name__ == '__main__':p = Person()p.say()
#yui is 18 years old

注意:实例方法的参数最少也要包含一个self参数。

3.4.2 类方法

Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。也就是说,我们在调用类方法时,无需显式为 cls 参数传参。
和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。
和实例方法最大的不同在于,类方法需要使用@classmethod修饰符进行修饰,例如:

class Person:def __init__(self):pass@classmethoddef say(cls):print('hello world')
if __name__ == '__main__':Person.say()
'''
hello world
'''

4.总结

本篇博客主要讲解了,python中的一些特性,如self、类属性和实例属性、类方法和实例方法。对于python的类和对象并未完全讲完,如static方法,继承与多态等等,在下期我会更新出python类和对象的下一部分。
在这里插入图片描述

相关文章:

解锁面向对象编程:Python 类与对象详解

&#x1f3e0;大家好&#xff0c;我是Yui_&#x1f4ac; &#x1f351;如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680;如有不懂&#xff0c;可以随时向我提问&#xff0c;我会全力讲解~ &#x1f52…...

国产编辑器EverEdit -重复行

1 重复行 1.1 应用场景 在代码或文本编辑过程中&#xff0c; 经常需要快速复制当前行&#xff0c;比如&#xff0c;给对象的多个属性进行赋值。传统的做法是&#xff1a;选中行-> 复制-> 插入新行-> 粘贴&#xff0c;该操作有4个步骤&#xff0c;非常繁琐。 那有没…...

记一次数据库连接 bug

整个的报错如下&#xff1a; com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Metho…...

【Springboot相关知识】Springboot结合SpringSecurity实现身份认证以及接口鉴权

Springboot结合SpringSecurity实现身份认证以及接口鉴权 身份认证1. 添加依赖2. 配置JWT工具类3. 配置Spring Security4. 创建JWT请求过滤器5. 创建认证控制器6. 创建请求和响应对象7. 配置UserDetailsService8. 运行应用程序9. 测试总结 接口鉴权1. 启用方法级安全注解2. 定义…...

算法竞赛之差分进阶——等差数列差分 python

目录 前置知识进入正题实战演练 前置知识 给定区间 [ l, r ]&#xff0c;让我们把数组中的[ l, r ] 区间中的每一个数加上c,即 a[ l ] c , a[ l 1 ] c , a[ l 2] c , a[ r ] c; 怎么做&#xff1f;很简单&#xff0c;差分一下即可 还不会的小伙伴点此进入学习 进入正题 …...

20250121在Ubuntu20.04.6下使用Linux_Upgrade_Tool工具给荣品的PRO-RK3566开发板刷机

sudo upgrade_tool uf update.img 20250121在Ubuntu20.04.6下使用Linux_Upgrade_Tool工具给荣品的PRO-RK3566开发板刷机 2025/1/21 11:54 百度&#xff1a;ubuntu RK3566 刷机 firefly rk3566 ubuntu upgrade_tool烧写详解 https://wiki.t-firefly.com/Core-3566JD4/03-upgrad…...

【Elasticsearch】Springboot编写Elasticsearch的RestAPI

RestAPI 初始化RestClient创建索引库Mapping映射 判断索引库是否存在删除索引库总结 ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。 官方文档地址 由于ES目前最新版本是8.8&#xff0c;提供了全…...

Python数据可视化(够用版):懂基础 + 专业的图表抛给Tableau等专业绘图工具

我先说说文章标题中的“够用版”啥意思&#xff0c;为什么这么写。 按照我个人观点&#xff0c;在使用Python进行数据分析时&#xff0c;我们有时候肯定要结合到图表去进行分析&#xff0c;去直观展现数据的规律和特定&#xff0c;那么我们肯定要做一些简单的可视化&#xff0…...

1.21学习

misc buuctf-爱因斯坦 下载附件后是一个图片&#xff0c;用stegsolve查看一下&#xff0c;各个色都没有问题&#xff0c;然后看一下数据分析&#xff0c;除此之外无其他信息&#xff0c;再看看图片属性&#xff0c;不知道是啥&#xff0c;用随波逐流进行binwalk文件提取然后得…...

SoftGNSS软件接收机源码阅读(一)程序简介、运行调试、执行流程

原始 Markdown文档、Visio流程图、XMind思维导图见&#xff1a;https://github.com/LiZhengXiao99/Navigation-Learning 文章目录 一、softGNSS 简介1、概述2、相关工作3、我用 softGNSS 做的事4、文件结构5、程序执行流程图 二、程序使用1、射频前端2、参数设置3、处理开源数据…...

Spring Boot AOP实现动态数据脱敏

依赖&配置 <!-- Spring Boot AOP起步依赖 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>/*** Author: 说淑人* Date: 2025/1/18 23:03* Desc…...

Leetcode刷题-二分查找

灵神的二分视频&#xff1a;二分查找 红蓝染色法_哔哩哔哩_bilibili 34 class Solution:def searchRange(self, nums: List[int], target: int) -> List[int]:right len(nums) - 1left 0res [-1,-1]mid int((right left)/2)while right > left:if nums[mid] < …...

凭证Account Assignment的校验(FAGL_VALIDATE)

本文主要介绍在S4 HANA OP中凭证Account Assignment的校验配置。具体请参照如下内容&#xff1a; 目录 1. 定义Account Assignment校验策略(FAGL_VALIDATE) 1.1 Derivation Rule 1.2 Assignment 1.3 Initialize 1.4 Enhancement 2. 分配Account Assignment校验策略给公司…...

【20】Word:小许-质量管理-论文❗

目录 题目​ NO1.2.3.4.5 NO6.7 NO8 NO9 NO10.11 题目 NO1.2.3.4.5 另存为“Word.docx”文件在考生文件夹下&#xff0c;F12Fn是另存为的作用布局→页面设置对话框→纸张&#xff1a;大小A4→页边距&#xff1a;上下左右不连续ctrl选择除表格外的所有内容→开始→字体对…...

二十八、Qos服务质量

Qos服务质量 一、产生原因 Resources也不是万能的,使用一段时间后,资源总量可能会超过接节点配置。 根据这个情况,我们可以设置,清除资源。给pod配置,按顺序删除 二、服务质量QoS分类 Guaranteed:最高服务质量(保证),当宿主机内存不够时,会先kill掉QoS为BestEffort…...

Flutter 改完安卓 applicationId 后App 闪退问题。

一、问题 当我们项目创建完&#xff0c;想 build.gradle 改 applicationId 的时候&#xff0c;再次执行的时候可能会出现 app 闪退问题&#xff0c; 控制台不显示任何错误提示 也不出现 Exit 停止运行的情况。&#xff08;像下方这样&#xff0c; 而 app 只是在模拟器中一闪而…...

es 3期 第25节-运用Rollup减少数据存储

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…...

小菜鸟系统学习Python第三天

1.优先级问题: 结论: 幂运算>正负号>加减乘除和整除>比较运算符>逻辑运算符 2.三元运算符 3.assert断言:抛出AssertionError异常 4.for循环 4. 5.break和continue...

七.网络模型

最小(支撑)树问题 最小部分树求解&#xff1a; 破圈法&#xff1a;任取一圈&#xff0c;去掉圈中最长边&#xff0c;直到无圈&#xff1b; 加边法&#xff1a;取图G的n个孤立点&#xff5b;v1&#xff0c;v2&#xff0c;…&#xff0c; vn }作为一个支撑图&#xff0c;从最短…...

1170 Safari Park (25)

A safari park&#xff08;野生动物园&#xff09;has K species of animals, and is divided into N regions. The managers hope to spread the animals to all the regions, but not the same animals in the two neighboring regions. Of course, they also realize that t…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...