知识速查大全:python面向对象基础

目录

一、面向对象的基本概念

二、类和对象

1.类

2.对象

三、属性(数据)和方法

1.数据

1.1.实例数据

1.2.类数据

2.方法

2.1.实例方法

2.2.类方法

3.数据和方法的综合使用

四、面向对象三大特性

1.封装

2.继承

2.1.单继承

2.2.多继承

2.3.混合类

2.4.方法解析顺序(MRO)

3.多态

五、数据访问级别

1.公有

2.私有

3.保护

六、类的成员

特点

七、魔法函数

1.__init__

2.__str__

3.数学比较

4.__len__

5.__new__(cls)、__del__

6.上下文管理器

总结


一、面向对象的基本概念

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它以"对象"为核心组织代码和数据,他更适合一些复杂项目的开发,通过封装方法和属性,让代码的复用性增强,提高了开发效率。

二、类和对象

类是抽象的,对象是具体的。

1.类

类是创建对象的蓝图或模板,它定义了对象的属性和行为。下面是定义一个类:

class MyClass:"""一个简单的类示例"""pass

2.对象

对象是类的实例,是根据类创建的具体实体。以下是对上述类的一个实例化对象:

obj = MyClass()

三、属性(数据)和方法

1.数据

所谓数据,就是事物所具有的一定的特征。

1.1.实例数据

实例数据属于特定实例的变量,通过self在方法中定义和访问。例如,下面定义了一个学生Student类,在类里面定义了两个属性,分别是self.name和self.age,这个就是实例数据。

class Student:def __init__(self, name, age):self.name = name  # 实例属性self.age = age    # 实例属性stu1 = Student("张三", 20)
stu2 = Student("李四", 22)
print(stu1.name)  # 输出: 张三
print(stu2.name)  # 输出: 李四

1.2.类数据

类数据属于类本身的变量,所有实例共享同一个类属性,定义在类内部但在方法外部。我们在学生类里面定义了类数据school,在类外部实例化两个对象,运行结果是都能打印出这个属性值。

class Student:school = "清华大学"  # 类属性def __init__(self, name):self.name = namestu1 = Student("王五")
stu2 = Student("赵六")
print(stu1.school)  # 输出: 清华大学
print(stu2.school)  # 输出: 清华大学

2.方法

所谓方法,就是事物所具有的一定的行为。

2.1.实例方法

实例方法的第一个参数必须是self,表示当前实例,可以访问和修改实例属性。下面的bark就是我们的实例方法,self表示当前的实例。

class Dog:def __init__(self, name):self.name = namedef bark(self):  # 实例方法print(f"{self.name}在汪汪叫!")dog = Dog("阿黄")
dog.bark()  # 输出: 阿黄在汪汪叫!

2.2.类方法

类方法使用@classmethod装饰器,第一个参数是cls,表示当前类,可以访问和修改类属性。get_count(cls)这个方法第一个参数是cls,说明当前是类这个级别,在类外面以对象的形式调用。

class Student:count = 0  # 类属性@classmethoddef get_count(cls):return cls.countdef __init__(self):Student.count += 1stu1 = Student()
stu2 = Student()
print(Student.get_count())  # 输出: 2

3.数据和方法的综合使用

问题:创建一个圆Circle类,为该类提供一个初始化方法,用于初始化半径;为该类提供两个方法,方法一用 于求圆的面积,方法二用于求圆的周长。

class Circle:PI = 3.14# 初始化方法def __init__(self, radius):self.radius = radiusdef get_area(self):return Circle.PI * self.radius ** 2def get_perimeter(self):return 2 * Circle.PI * self.radiusc = Circle(1)
print(c.get_area())
print(c.get_perimeter())

四、面向对象三大特性

1.封装

将数据和操作数据的方法绑定在一起即为封装。封装在类中非常常见,封装完成后,进行类的实例化即可。

class Product:def __init__(self, name, price):self.name = nameself.price = pricedef get_price(self):return self.priceclass Food:def __init__(self, weight):self.weight = weightdef get_qian(self):print(Product("食物", 49.9).price)
f = Food(20)
f.get_qian() # 输出49.9

2.继承

2.1.单继承

一个子类只继承一个父类,这样的继承叫做单继承。

# 继承
class Animal:def __init__(self, age):self.age = agedef __str__(self):return "hello"def shark(self):print("动物都会叫")a = Animal(5)
print(a, a.age)
a.shark()class Dog(Animal):def __init__(self, age, name):super().__init__(age)self.name = namedef __str__(self):return "这是一只狗狗"def shark(self):print("狗正在叫喊")d = Dog(7, "lida")
print(d, d.age, d.name)
d.shark()class AQ(Dog):def __init__(self, age, name, height):super().__init__(age, name)self.height = heightdef __str__(self):return "这是一只Dog队"def shark(self):print("团队活动正在精心准备进行")aq = AQ(9, "huange", 2.5)
print(aq, aq.age, aq.name, aq.height)
aq.shark()

2.2.多继承

多继承的一个子类可以继承多个父类。

class Father:def __init__(self, money):self.money = moneydef get_money(self):print(self.money)class Mother:def __init__(self, beautiful):self.beautiful = beautifuldef get_beautiful(self):print(self.beautiful)class Son(Father, Mother):def __init__(self, money, beautiful):#     # 多继承中,子类只能继承(识别)第一个父类#     # super().__init__(money)#     # super().__init__(beautiful)#     # 多继承使用类调用,要有selfFather.__init__(self, money)Mother.__init__(self, beautiful)def show(self):return f"共计{self.money}"s = Son("100", "漂亮")
s.get_money()
s.get_beautiful()

当处于多继承时,子类使用超类调用,只能继承(识别第一个父类),因此,我们一般会通过“父类对象.__init__()”类调用的方法进行完整的继承。

2.3.混合类

一种特殊的多继承用法,用于添加功能,通常是以Mixin结尾。

class Life:def __init__(self, hb):self.hb = hbdef __str__(self):return f"生命值{self.hb}"class Animal:passclass SwimmingAbleMixin:def swim(self):print(f"鱼可以游泳")class Fish(Life, SwimmingAbleMixin):passf = Fish("100")
print(f) # 生命值100
f.swim() # 鱼可以游泳

2.4.方法解析顺序(MRO)

Python使用C3算法确定多继承时的查找顺序。

class A:passdef __str__(self):return "A"class B11:pass# def __str__(self):#     return "B11"class B12:def __str__(self):return "B12"class B1(B11, B12):pass# def __str__(self):#     return "B1"class B2:pass# def __str__(self):#     return "B2"class B(B1, B2):pass# def __str__(self):#     return "B"class C(B, A):pass# def __str__(self):#     return "C"c = C()
print(c)

3.多态

多态就是不同类的对象对同一消息做出不同的响应。一般都是编译型语言拥有的概念。

class Employee:def __init__(self, name, salary):self.name = nameself.salary = salarydef get_salary(self):raise NotImplemented("子类必须重写父类")class Manage(Employee):def __init__(self, bonus, name, salary):super().__init__(name, salary)self.bonus = bonusdef get_salary(self):total = self.salary + self.bonusreturn f"{self.name}的总工资为{total}"m = Manage(500, "刘强", 8000)
print(m.get_salary()) # 输出:刘强的总工资为8500

上述代码创建另一个基类和一个子类,两个类都有同一种方法get_salary(),但是需要通过子类重写父类实现。

  • 父类中的raise NotImplemented("子类必须重写父类")表示子类中必须要实现此方法,否则程序会出错。
  • 子类中super().__init__(name, salary)表明继承父类中的两个属性(数据)。

五、数据访问级别

1.公有

默认格式,类内通过self访问,类外通过对象访问。

class MyClass:def __init__(self):self.public_var = "I'm public"def public_method(self):return "Public method"obj = MyClass()
print(obj.public_var)      # 可以直接访问
print(obj.public_method()) # 可以直接调用

2.私有

__开头,类内以self访问,类外不可访问。

class MyClass:def __init__(self):self.__private_var = "I'm private"def __private_method(self):return "Private method"obj = MyClass()
# print(obj.__private_var)      # 直接访问会报错
# print(obj.__private_method()) # 直接调用会报错# 通过名称修饰后的名称仍可访问(但不应该这样做)
print(obj._MyClass__private_var)      # 可以访问
print(obj._MyClass__private_method()) # 可以调用

3.保护

_开头,本类内可以访问,本类外也可以访问,但不推荐;通常是在子类中使用。

class MyClass:def __init__(self):self._protected_var = "I'm protected"def _protected_method(self):return "Protected method"obj = MyClass()
print(obj._protected_var)      # 仍然可以访问,但不建议
print(obj._protected_method()) # 仍然可以调用,但不建议

六、类的成员

除了上述介绍的类的成员,下面还有一种类成员,就是静态方法。静态方法(Static Method)是一种属于类但不属于类的任何特定实例的方法。这意味着你可以调用静态方法而不创建类的实例。静态方法通常用于实现那些不依赖于类实例状态的工具方法或辅助方法。

class MyClass:@staticmethoddef static_method():print("Called static_method")@staticmethoddef sum(a, b):print(a + b)@staticmethoddef max(a, b):return a if a > b else bMyClass.static_method()
MyClass.sum(3, 5)
print(MyClass.max(12, 5))

上述代码中,我们在调用静态方法时,并没有进行实例化,而是通过函数名直接调用。

特点

  • 无需实例:你可以直接通过类名调用静态方法,无需创建类的实例。

  • 不接受 self 或 cls:静态方法不会自动接收任何类或实例作为第一个参数。

  • 用途:静态方法通常用于实现那些不需要访问类实例状态的函数,例如工厂方法、工具函数等。

七、魔法函数

1.__init__

__init__函数用于初始化self。

class Light:def __init__(self):"""初始化函数:用于初始化selfself就是类执行产生的对象"""self.color = "红色"print(id(self))def set_light(self, color):self.color = colorprint(self.color)def get_light(self):print(self.color)创建对象l1
l1 = Light()
l1.set_light("绿色")
print(id(l1), l1.color)print("++++++++++++++")创建对象l2
l2 = Light()
l2.get_light()

2.__str__

__str__函数返回的结果必须是字符串,也是自动调用。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"Person(name='{self.name}', age={self.age})"p = Person("Alice", 30)
print(p)  # 输出: Person(name='Alice', age=30)

3.数学比较

数学比较的魔法函数有__gt__、__ge__、__lt__、__le__、__eq__和__ne__。所有的魔法函数不需要主动调用,以__**__为格式。

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):"""对象的字符串表示:return: 字符格式"""return  f"{self.name}:{self.age}"def __gt__(self, other):"""重写,实例比较的>:param other::return:"""return self.age > other.agedef __ge__(self, other):return  self.age >= otherdef __lt__(self, other):"""小于:param other::return:"""return self.age < other.agedef __le__(self, other):return self.age <= other.agedef __ne__(self, other):return self.age != other.agedef __eq__(self, other):return self.age == other.agep1 = Person("abc", 20)
print(p1)
p2 = Person("jsp", 26)
print(p1 <= p2)

4.__len__

__len__用于定义对象的长度。当对对象调用内置的 len() 函数时,Python 会自动调用该对象的 __len__ 方法。

class MyCollection:def __init__(self, items):self.items = itemsdef __len__(self):return len(self.items)collection = MyCollection([1, 2, 3, 4, 5])
print(len(collection))  # 输出: 5

5.__new__(cls)、__del__

构造函数:创建类的新实例对象;析构函数:用于对象销毁的特殊方法

class Animal:# 必须返回一个类的实例,否则init__,方法不会被调用。def __new__(cls, *args, **kwargs):# cls 是当前类对象,必须作为参数传入instance = super().__new__(cls)return instancedef __init__(self):print("初始化函数执行了", id(self))def __del__(self):print("正在销毁...")
# 先调用 __new__ 创建对象,再调用 __init__ 初始化对象
a = Animal()
print(a, id(a))

6.上下文管理器

__enter__:实现资源的获取;

__exit__:实现资源的释放。

class Myopen:def __init__(self, filename, mode):self.filename = filenameself.mode = modeself.file = Nonedef __enter__(self):self.file = open(self.filename, self.mode)return self.filedef write(self, msg):self.file.write(msg)def __exit__(self, exc_type, exc_val, exc_tb):# exc_type:异常类型# exc_val:异常值# exc_tb:追踪信息if self.file:self.file.close()with Myopen("myfile.txt", "w") as  f:f.write("Hello world!")

总结

面向对象编程(OOP)是一种以对象为核心的编程范式,其核心概念包括类与对象、属性与方法、三大特性(封装、继承、多态)以及数据访问控制等。类作为对象的抽象模板,通过定义属性和方法来描述实体的特征和行为,其中属性分为实例数据(对象独有)和类数据(类共享),方法则包括实例方法(操作实例数据)、类方法(操作类数据)等。面向对象三大特性中,封装通过访问控制(公有、私有、保护)隐藏实现细节;继承支持单继承和多继承,通过方法解析顺序(MRO)解决多继承冲突;多态则允许不同类对象对同一方法产生不同行为。类的特殊成员如魔法函数(如__init__构造对象、__str__定义字符串表示、__len__支持长度计算等)赋予类更灵活的行为能力。上下文管理器(__enter__/__exit__)等高级特性进一步扩展了对象的功能边界。这些概念共同构成了面向对象编程的完整体系,通过抽象、模块化和代码复用提升软件的可维护性和扩展性。

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

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

相关文章

Linux系统编程Day1-- 免费云服务器获取以及登录操作

一、 学生党如何“白嫖”或免费使用云服务器&#xff1f; 作为学生党&#xff0c;资金有限的情况下确实不容易长期负担服务器费用。但好消息是&#xff0c;有多种方式可以“白嫖”或低成本使用云服务器&#xff0c;尤其是针对学生身份、学习用途和开发者计划。 1、使用各大云平…

15.11 单卡训练770M参数模型!DeepSpeed ZeRO-3实战:RTX 4090显存直降6.8GB

单卡训练770M参数模型!DeepSpeed ZeRO-3实战:RTX 4090显存直降6.8GB 实战 DeepSpeed ZeRO-2 和 ZeRO-3 单机单卡训练 为什么需要单机单卡训练场景? 虽然 DeepSpeed 的 ZeRO 技术主要面向分布式训练场景,但单机单卡训练仍然具有重要实践价值: 开发调试:在资源有限情况下…

HTTPS基本工作过程:基本加密过程

HTTPS基本工作过程&#xff1a;HTTPS只是HTTP的基础上引入加密机制1.引入对称加密首先&#xff0c;什么是对称加密和非对称加密&#xff1f;对称加密&#xff1a;使用同一把密钥加密解密非对称加密&#xff1a;有两把密钥&#xff0c;为公钥&#xff08;公开的&#xff09;和私…

ES 文件浏览器:多功能文件管理与传输利器

ES 文件浏览器是一款功能强大的文件管理器软件&#xff0c;支持多种文件传输协议&#xff0c;能够方便地管理手机、平板电脑和电脑中的文件。它不仅提供了丰富的文件管理功能&#xff0c;还支持多种设备之间的文件传输&#xff0c;满足用户在不同场景下的需求。 核心功能 1. 文…

github-idea新建文件就要弹窗提醒-如何关闭-2025.7.30

打开设置 进入 File&#xff08;文件&#xff09; > Settings&#xff08;设置&#xff09;。 导航到版本控制设置&#xff1a; 在左侧导航栏中&#xff0c;展开 Version Control&#xff08;版本控制&#xff09;。 选择 Confirmation&#xff08;确认&#xff09;。修改文…

滚珠导轨在电子制造中的流畅性优势

在电子元件微米级精度要求的搬运与装配环节&#xff0c;传统导轨易因摩擦、磨损导致定位偏差或设备抖动。而滚珠导轨凭借滚动摩擦设计&#xff0c;将滑动阻力降低80%以上&#xff0c;成为高精度电子制造设备的首选传动部件。微米级精度&#xff1a;在贴片机中&#xff0c;滚珠导…

数据结构——单链表1

1. 单链表1.1 概念与结构概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。1.1.1 结点与顺序表不同的是&#xff0c;链表里的每节都是独立申请下来的空间&#xff0c;我们称之为“节点/结点…

STM32CubeMX + HAL库:基于DHT11温湿度监测实现

1. 概述1.1 实验目的本实验旨在利用 DHT11 温湿度传感器&#xff0c;每隔 5 秒采集一次环境的温度与湿度数据&#xff0c;并通过串口将数据循环打印输出。所使用的 DHT11 模块硬件结构简单&#xff0c;包含三个接口引脚&#xff1a;电源正极&#xff08;VCC&#xff09;、电源负…

常见排序的特性总结

目录 1.排序的稳定性 2.直接插入排序的特性总结 3.希尔排序的特性总结 4.直接选择排序的特性总结 5.堆排序的特性总结 6.冒泡排序的特性总结 7.快速排序的特性总结 8.归并排序的特性总结 9.计数排序的特性总结 10.总结 1.排序的稳定性 排序的稳定性是说 相同大小的元…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-49,(知识点:OSI模型,物理层、数据链路层、网络层)

目录 1、题目 2、解答 OSI 七层模型的分层及功能&#xff08;从下到上&#xff09; 1. 物理层&#xff08;Physical Layer&#xff09; &#xff1a;网卡的物理接口、网线、光纤、集线器 2. 数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;交换机&#xf…

R 环境安装指南

R 环境安装指南 引言 R 是一种针对统计计算和图形表示的编程语言和软件环境。它广泛应用于数据分析和统计建模领域。本指南旨在为用户提供一个清晰、详细的 R 环境安装步骤,确保用户能够顺利地开始使用 R 进行数据分析。 安装前的准备 在开始安装 R 之前,请确保您的计算机…

Cesium entity跟随第一人称视角

1.跟随视角let firstView:any; const firstPerspective (entity: any) > {firstView () > {let curTime window.viewer.clock.currentTime;const pos entity.position.getValue(curTime);const orientation entity.orientation.getValue(curTime);if (pos &&…

传输层协议UDP与TCP

目录 一. UDP 1.1 UDP协议段格式 1.2 UDP传输的特点 1.3 面向数据报 1.4 UDP缓冲区 1.5 报文的理解 二. TCP 2.1 TCP协议段格式 2.2 确认应答机制&#xff08;ACK&#xff09; 2.3 超时重传机制 2.4 连接管理机制 为什么要三次握手&#xff1f; 三次&#xff1f;四…

SringBoot入门

文章目录SpringBoot入门一、关于&#xff1a;约定大于配置二、创建SpringBoot项目---起步案例创建SpringBoot项目案例创建项目方式2&#xff1a;通过aliyun网站创建创建项目方式3---基于官方地址创建三、配置项目项目结构自定义配置四、SpringBoot原理&#xff08;重点&#xf…

ansible 版本升级

1. 服务器上查看对应ansible 可安装的版本 yum info ansible 对比官网,服务器对应ansible 版本比较地址,不利于了解新版本的属性。 2. 升级比较新的ansible 版本,安装epel-release wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm rpm -iv…

企业微信API接口发消息实战:从0到1的技术突破之旅

摘要&#xff1a;本文详细介绍了通过企业微信官方API接口实现消息发送功能的完整实战流程。首先阐述了企业微信API在数字化办公中的重要性&#xff0c;重点讲解了消息发送接口的应用场景。实战部分分为前期准备、开发环境搭建和具体实现三个环节&#xff0c;包括创建企业微信应…

Linux的小程序——进度条

为了写出这个小程序我们先来了解几个知识点(一)回车和换行先以写作文为例子了解一下&#xff0c;当在一行中写了一半&#xff0c;由此处位置往下一行的操作叫做换行&#xff0c;回到该行的开头位置为回车。而在c语言中\n帮我们完成了换行和回车两个动作&#xff0c;那单纯回车是…

在macOS上使用VS Code和Clang配置C++开发环境

本文基于VS Code官方文档&#xff0c;详细介绍如何在macOS系统下配置Clang/LLVM编译器与VS Code的C开发环境。通过本文&#xff0c;你将学会如何搭建开发环境、创建并调试C程序&#xff0c;适合C初学者和需要在macOS上进行C开发的开发者。 前提条件 在开始配置前&#xff0c;…

Ganttable 基于工时的进度分析

时间进度分析是 Ganttable 提供的高级进度管理功能&#xff0c;它基于实际工作时长&#xff0c;结合计划预估工时&#xff0c;可精准计算项目及任务的完成度。开启进度分析开启进度分析功能的操作如下&#xff1a;在时间管理页面&#xff0c;点击右上角的 “设置” 按钮&#x…

duiLib 自定义资源目录

前面的demo&#xff0c;把布局文件放在默认目录了&#xff0c;想着应该也可以自定义资源路径。先debug看下默认目录是什么路径。设置调试选项&#xff0c;调试信息格式改为程序数据库&#xff08;/Zi&#xff09;再调试项目&#xff0c;选中监视1&#xff1a;在监护窗口中查看变…