面向对象编程(OOP)是一种以对象为核心的编程范式。Python全面支持OOP,主要包含以下核心概念:

一、类与对象

1.类(Class)

类是创建对象的模板或蓝图,它定义了对象的属性和方法。

class Dog:# 类属性(所有实例共享)species = "Canis familiaris"# 初始化方法(构造对象)def __init__(self, name, age):# 实例属性(每个对象独立)self.name = nameself.age = age# 实例方法def bark(self):return f"{self.name} says Woof!"

2.对象(Object)

对象是类的实例,具有类定义的属性和方法。

my_dog = Dog("Buddy", 3)
print(my_dog.bark())  # 输出: Buddy says Woof!

二、三大核心特性

1.封装(Encapsulation)

        封装是将数据(属性)和操作数据的方法(行为)绑定在一起,并隐藏内部实现细节,只对外提供必要的接口。Python通过私有属性和私有方法实现封装。

class BankAccount:def __init__(self, balance=0):self.__balance = balance  # 私有属性def deposit(self, amount):if amount > 0:self.__balance += amountreturn Truereturn Falsedef withdraw(self, amount):if 0 < amount <= self.__balance:self.__balance -= amountreturn Truereturn Falsedef get_balance(self):  # 提供获取余额的方法return self.__balanceaccount = BankAccount(100)
account.deposit(50)
print(account.get_balance())  # 输出: 150
# print(account.__balance)  # 报错,无法直接访问私有属性

2.继承(Inheritance)

继承允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码的重用和扩展。

class Animal:def __init__(self, name):self.name = namedef speak(self):raise NotImplementedError("Subclass must implement abstract method")class Dog(Animal):def speak(self):return f"{self.name} says woof!"class Cat(Animal):def speak(self):return f"{self.name} says meow!"dog = Dog("Buddy")
cat = Cat("Whiskers")
print(dog.speak())  # 输出: Buddy says woof!
print(cat.speak())  # 输出: Whiskers says meow!

3.多态(Polymorphism)

        多态是指同一个方法调用在不同对象上产生不同的行为。在Python中,多态通过继承和方法重写实现。

# 继续使用上面的Animal、Dog和Cat类def animal_sound(animal):print(animal.speak())animals = [Dog("Buddy"), Cat("Whiskers")]
for animal in animals:animal_sound(animal)  # 分别输出: Buddy says woof! 和 Whiskers says meow!

三、类成员详解

        类成员是面向对象编程的核心概念,Python中的类成员主要分为三类:属性方法特殊成员。下面详细解析各类成员的特性和用法:

1.属性(Attributes)

类型定义方式访问方式特点示例
实例属性self.attr = valueobj.attr每个对象独立self.name = "Alice"
类属性类内部直接定义Class.attr所有实例共享species = "Human"
保护属性_attr(单下划线前缀)obj._attr约定私有,可访问self._id = 123
私有属性__attr(双下划线前缀)obj._Class__attr名称修饰,强私有self.__password = "***"

 (1).类属性

类属性是属于类的,所有对象共享该属性。

class Circle:# 类属性pi = 3.14159def __init__(self, radius):self.radius = radiusdef area(self):return Circle.pi * self.radius ** 2circle1 = Circle(5)
circle2 = Circle(10)print(circle1.area())  # 输出: 78.53975
print(circle2.area())  # 输出: 314.159

(2).实例属性

实例属性是属于对象的,每个对象可以有不同的属性值。

class Dog:def __init__(self, name, breed):# 实例属性self.name = nameself.breed = breeddog1 = Dog("Buddy", "Golden Retriever")
dog2 = Dog("Max", "German Shepherd")print(dog1.name)  # 输出: Buddy
print(dog2.breed) # 输出: German Shepherd

 综合案例:

class User:# 类属性(所有用户共享)platform = "WebApp"def __init__(self, name):# 实例属性(每个用户独立)self.name = name# 保护属性(约定私有)self._session_id = id(self)# 私有属性(强私有)self.__password = "default"# 访问示例
u = User("Alice")
print(u.platform)        # 类属性 → "WebApp"
print(u.name)            # 实例属性 → "Alice"
print(u._session_id)     # 保护属性 → 123456
print(u.__password)      # 报错!AttributeError
print(u._User__password) # 私有属性 → "default"(不推荐)

2.方法(Methods)

类型定义方式调用方式特点参数要求
实例方法def method(self, ...):obj.method()可访问实例/类属性必须包含self
类方法@classmethodClass.method()操作类属性,创建工厂方法必须包含cls
静态方法@staticmethodClass.method()功能独立,无状态依赖无特殊参数

(1). 实例方法

实例方法是属于对象的方法,第一个参数通常是 self,用于引用对象本身。

class Rectangle:def __init__(self, length, width):self.length = lengthself.width = width# 实例方法def area(self):return self.length * self.widthrect = Rectangle(5, 10)
print(rect.area())  # 输出: 50

(2).类方法

        类方法是属于类的方法,使用 @classmethod 装饰器定义,第一个参数通常是 cls,用于引用类本身。

class Pizza:def __init__(self, radius, ingredients):self.radius = radiusself.ingredients = ingredients@classmethoddef margherita(cls):return cls(12, ["tomato sauce", "mozzarella", "basil"])@classmethoddef pepperoni(cls):return cls(14, ["tomato sauce", "mozzarella", "pepperoni"])pizza1 = Pizza.margherita()
pizza2 = Pizza.pepperoni()print(pizza1.ingredients)  # 输出: ['tomato sauce', 'mozzarella', 'basil']
print(pizza2.radius)       # 输出: 14

(3).静态方法

静态方法是属于类的方法,使用 @staticmethod 装饰器定义,不需要 self 或 cls 参数。

class Math:@staticmethoddef add(a, b):return a + bresult = Math.add(3, 5)
print(result)  # 输出: 8

综合案例: 

class Calculator:# 类属性PI = 3.14159# 实例方法def add(self, a, b):return a + b# 类方法@classmethoddef circle_area(cls, radius):return cls.PI * radius ** 2# 静态方法@staticmethoddef is_even(num):return num % 2 == 0# 调用示例
calc = Calculator()
calc.add(2, 3)             # 实例方法 → 5
Calculator.circle_area(2)   # 类方法 → 12.56636
Calculator.is_even(7)       # 静态方法 → False

3.特殊成员(魔术方法)

        魔术方法(Magic Methods)是 Python 面向对象编程的核心特性,它们以双下划线开头和结尾(如 __init__),用于定义类的特殊行为。这些方法会在特定操作发生时自动调用,让自定义类拥有类似内置类型的行为。

类别常用方法触发场景
对象生命周期__new____init____del__创建、初始化、销毁对象
字符串表示__str____repr____format__print()str()format()
运算符重载__add____sub____mul____eq____lt__ 等+-*==< 等操作
容器行为__len____getitem____setitem____contains____iter__len()[]infor循环
属性访问__getattr____getattribute____setattr____delattr__属性访问、设置、删除
可调用对象__call__obj() 函数式调用
上下文管理__enter____exit__with 语句
数值转换__int____float____bool__int()float()bool()

1. 对象生命周期方法

class Lifecycle:def __new__(cls, *args, **kwargs):print("创建对象(内存分配)")return super().__new__(cls)def __init__(self, name):print(f"初始化对象: {name}")self.name = namedef __del__(self):print(f"销毁对象: {self.name}")obj = Lifecycle("Test")  # 输出: 创建对象 → 初始化对象: Test
del obj                 # 输出: 销毁对象: Test

2. 字符串表示方法

class Person:def __init__(self, name, age):self.name = nameself.age = age# 用户友好展示def __str__(self):return f"{self.name} ({self.age}岁)"# 开发者调试/重建对象def __repr__(self):return f"Person('{self.name}', {self.age})"# 格式化输出def __format__(self, format_spec):if format_spec == 'short':return self.name[0].upper()return str(self)p = Person("张三", 30)
print(str(p))    # 张三 (30岁)
print(repr(p))   # Person('张三', 30)
print(f"{p:short}")  # 张

 其他不在一一展示

class Vector2D:def __init__(self, x, y):self.x = xself.y = y# 字符串表示(用户友好)def __str__(self):return f"({self.x}, {self.y})"# 运算符重载(向量加法)def __add__(self, other):return Vector2D(self.x + other.x, self.y + other.y)# 长度定义(模长)def __len__(self):return int((self.x**2 + self.y**2)**0.5)v1 = Vector2D(3, 4)
v2 = Vector2D(1, 2)
print(v1)          # 触发__str__ → (3, 4)
print(v1 + v2)     # 触发__add__ → (4, 6)
print(len(v1))     # 触发__len__ → 5

四、高级特性

1.属性访问控制

@property装饰器实现属性保护

class Temperature:def __init__(self, celsius):self._celsius = celsius  # 保护属性@propertydef celsius(self):  # Getterreturn self._celsius@celsius.setterdef celsius(self, value):if value < -273.15:raise ValueError("Too cold")self._celsius = value

2.抽象基类(ABC)

定义接口规范

from abc import ABC, abstractmethodclass Animal(ABC):@abstractmethoddef speak(self):passclass Cat(Animal):def speak(self):  # 必须实现抽象方法return "Meow"

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

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

相关文章

快速入门Socket编程——封装一套便捷的Socket编程——导论

快速入门Socket编程——封装一套便捷的Socket编程——导论 前言 ​ 这里是笔者打算做的Socket编程的第二部分&#xff0c;也就是核心的讨论我们Socket编程本身。 导论 ​ 我们知道&#xff0c;一个经典的服务器套接字的处理流程是如下的&#xff1a; 创建一个指定传输层和网络层…

【Mermaid 离线工具】Mermaid 流程图生成器 - 高清PNG输出,一键生成专业级流程图!

文章目录 Mermaid 流程图生成器(离线版本):高效绘图,离线也能玩转专业可视化 一、Mermaid:文本绘图的 “魔法语法” 二、离线版生成器:功能与优势解析 (一)离线可用,场景更灵活 (二)操作流程:简单五步,产出专业图表 (三)界面设计:简洁直观,降低使用门槛 三、应…

haproxy原理及实战部署

一、负载均衡 负载均衡是网络架构和分布式系统中至关重要的技术&#xff0c;其核心作用是将大量的并发请求或数据流量合理分配到多个服务器&#xff08;或其他资源节点&#xff09;上&#xff0c;从而解决单节点压力过大、资源利用率低、系统稳定性差等问题。 作用1. 提高系统吞…

jwt 在net9.0中做身份认证

一、新建net9.0项目WebApplication1&#xff0c;安装包 <ItemGroup><PackageReference Include"Microsoft.AspNetCore.Authentication.JwtBearer" Version"9.0.7" /><PackageReference Include"Swashbuckle.AspNetCore" Version&…

【机器学习深度学习】微调能改变模型“智商”吗?——模型能力与知识的本质解析

目录 前言 一、模型的“知识”与“能力”&#xff1a;两种不同的智能 第一种&#xff1a;浅层知识&#xff08;记忆 模式识别&#xff09; 第二种&#xff1a;深层能力&#xff08;推理 理解&#xff09; 二、微调&#xff1a;改变的是“经历”&#xff0c;不是“天赋”…

oracle数据库表空间碎片整理

oracle数据库表空间碎片整理 表空间碎片情况检查 表空间碎片问题处理 收缩表 表空间手动整理 exp/imp导出再导入 移动表到新的表空间 表空间碎片情况检查 对比表实际使用空间和数据文件占用空间: --实际数据占用空间 select tablespace_name,round(sum(bytes/1024/1024/1024…

为什么需要可重入锁

在黑马点评项目实战中&#xff0c;提到了可重入锁&#xff0c;然后我想到了是不是不同业务在同一线程内反复获取同一把锁。本文来讨论一下为什么锁需要可重入。一、可重入锁的核心&#xff1a;“同一线程多次获取同一把锁”​​可重入&#xff08;Reentrant&#xff09;​​ 的…

【AI】联网模式

【AI】联网模式 文章目录【AI】联网模式1. 简介2. 接入步骤2.1 引入依赖2.2 方法构建2.3 接口构建1. 简介 在使用联网模式之前&#xff0c;我们如果问起ai一些最近网络上流传的一些东西&#xff0c;它可能并不能准确的给你描述出来&#xff0c;因为它的知识库更新时间可能停留…

第10篇:实战验收篇

&#x1f50d; 实战演练&#xff1a;多条件房源查询 需求描述 查找一套符合以下条件的房子&#xff1a; 预算&#xff1a;2000–3000元区域&#xff1a;天河区户型&#xff1a;两房 关键词&#xff1a;多条件查询 AND BETWEEN LIKE 组合运用&#x1f3ac; 开场白“听起来不难&a…

深入解析YARN中的FairScheduler与CapacityScheduler:资源分配策略的核心区别

YARN资源调度器概述在Hadoop生态系统中&#xff0c;YARN&#xff08;Yet Another Resource Negotiator&#xff09;作为核心资源管理平台&#xff0c;其架构设计将计算资源管理与作业调度解耦&#xff0c;形成了"全局资源管理器&#xff08;ResourceManager&#xff09;节…

基于Seata的微服务分布式事务实战经验分享

基于Seata的微服务分布式事务实战经验分享 1. 业务场景描述 在电商系统中&#xff0c;用户下单会涉及多个微服务&#xff1a;订单服务&#xff08;Order Service&#xff09;、库存服务&#xff08;Inventory Service&#xff09;、账户服务&#xff08;Account Service&#x…

Linux库——库的制作和原理(2)_库的原理

文章目录库的原理理解目标文件ELF文件读取ELF的工具——readelfELF从形成到加载的轮廓ELF形成可执行文件ELF可执行的加载理解链接与加载静态链接ELF加载和进程地址空间虚拟地址 & 逻辑地址重新理解进程地址空间动态链接和动态库的加载进程如何找到动态库多个进程之间如何共…

Redis C++客户端——通用命令

目录 代码案例 get和set部分 exists部分 del部分 keys部分 expire部分 type部分 本篇文章主要是通过redis-plus-plus库使用通用命令。 代码案例 下面用一个代码演示&#xff1a; #include <sw/redis/redis.h> #include <iostream> #include <vecto…

手机开启16k Page Size

我买了一个pixel8的手机&#xff0c;系统是Android16,如下操作都是基于这个手机做的。 https://source.android.com/docs/core/architecture/16kb-page-size/16kb-developer-option?hlzh-cn#use_16kb_toggle 使用 16 KB 切换开关 按照开发者选项文档中的指示启用开发者选项。…

VLAN的划分(基于华为eNSP)

VLAN的划分 前言&#xff1a;为什么VLAN是现代网络的“隐形骨架”&#xff1f; 当一台办公室电脑发送文件给隔壁工位的同事时&#xff0c;数据如何精准抵达目标而不“打扰”其他设备&#xff1f;当企业财务部的敏感数据在网络中传输时&#xff0c;如何避免被其他部门的设备“窥…

从压缩到加水印,如何实现一站式图片处理

当你需要对大量图片进行相同或相似的操作时&#xff08;例如压缩、裁剪、调整尺寸、添加水印等&#xff09;&#xff0c;逐个处理会非常耗时。批量处理工具可以一次性处理数百张图片&#xff0c;大大节省了时间。这是一款极致轻巧的图片处理利器&#xff0c;体积仅有652KB&…

Pythong高级入门Day5

二、面向对象编程面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种通过组织对象来设计程序的编程方法。Python天生就是面向对象的模块化编程。1. 初识类和对象示意图&#xff1a;/-------> BYD E6(京A.88888) 实例&#xff0c;对…

C#其他知识点

接口类---interface什么是接口? 在接口当中一般我们认为接口中的成员都是抽象的。接口一般认为是功能的集合。在接口类当中定义的方法都是抽象象方法。(没有方法体)接口一般我们认为它是一种标准,一种规范,一种约定。给子类或者是派生类制定规范,规定,标准。当子类继承了该接口…

Maven 环境配置全攻略:从入门到实战

一、Maven 简介 Maven 是一个基于项目对象模型 (POM) 的项目管理工具&#xff0c;它可以通过一小段描述信息来管理项目的构建、报告和文档。 除了强大的程序构建能力外&#xff0c;Maven 还提供了高级项目管理功能。其默认构建规则具有很高的可重用性&#xff0c;通常只需两三…

现代 C++ 开发工作流(VSCode / Cursor)

✅ 推荐的现代 C 开发工作流&#xff08;含 VSCode / Cursor 插件配置&#xff09;&#x1f9f0; 一、环境要求 C 编译器&#xff08;如 g 或 clang&#xff09;CMake&#xff08;建议 ≥ 3.16&#xff09;clangd&#xff08;建议 ≥ 14&#xff0c;最好用系统包管理器安装&…