1.类(Class)

在Python中类(Class)是面向对象编程(OOP)的核心概念。

1.1.类的基本定义

  • 最简单的类
class Cat:"""这是一个最简单的类"""pass
#创建实例
obj = Cat()
  • 包含方法的类
class Cat:"""这是一个最简单的类"""def bark(self):return "miao"def eat(self, food):return f"吃{food}"
#创建实例
obj = Cat()

1.2.构造方法__init__()

class Person:def __init__(self, name, age):"""构造方法,初始化示例属性"""self.name = nameself.age = ageself.is_adult = age >= 18def introduce(self):return f"我叫{self.name}, 今年{self.age}岁"#创建实例
person = Person("张三", 25)
print(person.introduce())

1.3.类属性和实例属性

class Car:#类属性wheels = 4country = "中国"def __init__(self, brand, color):#实例属性self.brand = brandself.color = colordef info(self):return  f"{self.color}的{self.brand},有{self.wheels}个轮子"car = Car("丰田", "黑色")
print(car.info())

1.4.继承

类的继承可以包括单集成多集成,类定义后面括弧里面添加集成的父类

  • 单继承
class Animal:def __init__(self, name):self.name = namedef speak(self):return "动物叫"class Dog(Animal):def __init__(self, name, breed):super().__init__(name)self.breed = breeddef speak(self):return "旺旺"def fetch(self):return f"{self.name}在接飞盘"#使用
dog = Dog("小黑", "拉布拉多")
print(dog.speak())
print(dog.fetch())
print(dog.name)
  • 多继承
class Flyable:def fly(self):return "我能飞"class Swimmable:def swim(self):return "我能游泳"class Duck(Flyable, Swimmable):  # 多继承def __init__(self, name):self.name = namedef quack(self):return "嘎嘎!"# 使用
duck = Duck("唐老鸭")
print(duck.quack())  # 输出: 嘎嘎!
print(duck.fly())  # 输出: 我能飞
print(duck.swim())  # 输出: 我能游泳

1.5.封装-访问控制

使用命名约定

class BankAccount:def __init__(self, owner, balance=0):self.owner = owner       # 公开属性self._balance = balance  # 受保护属性(约定)self.__password = "123456"  # 私有属性(名称修饰)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._balancedef _internal_method(self):"""受保护方法"""return "内部方法"def __private_method(self):"""私有方法"""return "私有方法"# 使用
account = BankAccount("张三", 1000)
print(account.owner)        # 输出: 张三
print(account.get_balance()) # 输出: 1000# 仍然可以访问(但不应该)
print(account._balance)     # 输出: 1000
# print(account.__password)  # 错误:AttributeError

1.6类方法和静态方法

class MathUtils:# 类属性PI = 3.14159@classmethoddef circle_area(cls, radius):"""类方法:计算圆面积"""return cls.PI * radius ** 2@staticmethoddef add(a, b):"""静态方法:加法"""return a + bdef instance_method(self):"""实例方法"""return "实例方法"# 使用
print(MathUtils.circle_area(5))  # 输出: 78.53975
print(MathUtils.add(3, 4))       # 输出: 7# 也可以通过实例调用
utils = MathUtils()
print(utils.circle_area(3))      # 输出: 28.27431

1.7使用示例

class Student:def __init__(self, name, student_id):self.name = nameself.student_id = student_idself.courses = {}  # 课程字典 {课程名: 成绩}self.gpa = 0.0def enroll_course(self, course_name):"""选课"""if course_name not in self.courses:self.courses[course_name] = Nonereturn Truereturn Falsedef update_grade(self, course_name, grade):"""更新成绩"""if course_name in self.courses and 0 <= grade <= 100:self.courses[course_name] = gradeself._calculate_gpa()return Truereturn Falsedef _calculate_gpa(self):"""计算GPA(私有方法)"""valid_grades = [g for g in self.courses.values() if g is not None]if valid_grades:self.gpa = sum(valid_grades) / len(valid_grades)def get_info(self):"""获取学生信息"""return {'name': self.name,'student_id': self.student_id,'courses': self.courses.copy(),'gpa': self.gpa}def __str__(self):return f"学生{self.name}(学号:{self.student_id})"class StudentManager:def __init__(self):self.students = {}def add_student(self, name, student_id):"""添加学生"""if student_id not in self.students:self.students[student_id] = Student(name, student_id)return Truereturn Falsedef get_student(self, student_id):"""获取学生"""return self.students.get(student_id)def remove_student(self, student_id):"""删除学生"""if student_id in self.students:del self.students[student_id]return Truereturn False# 使用示例
manager = StudentManager()
manager.add_student("张三", "2023001")
manager.add_student("李四", "2023002")student = manager.get_student("2023001")
student.enroll_course("数学")
student.enroll_course("英语")
student.update_grade("数学", 85)
student.update_grade("英语", 92)print(student.get_info())

1.8抽象基类

from abc import ABC, abstractmethodclass Shape(ABC):  # 抽象基类@abstractmethoddef area(self):"""计算面积"""pass@abstractmethoddef perimeter(self):"""计算周长"""passclass Rectangle(Shape):def __init__(self, width, height):self.width = widthself.height = heightdef area(self):return self.width * self.heightdef perimeter(self):return 2 * (self.width + self.height)# 使用
rect = Rectangle(5, 3)
print(f"面积: {rect.area()}")       # 输出: 面积: 15
print(f"周长: {rect.perimeter()}")  # 输出: 周长: 16# shape = Shape()  # 错误:不能实例化抽象类

2.方法(Method)

2.1.方法类型

方法的类型分为示例方法、类方法、静态方法

  • 实例方法
class Calculator:def add(self, a, b):  # self是必须的第一个参数"""实例方法:加法"""return a + bdef multiply(self, a, b):"""实例方法:乘法"""return a * b# 使用
calc = Calculator()
result = calc.add(5, 3)  # 输出: 8
print(result)

通过使用注解@classmethod

  • 类方法
class MathUtils:PI = 3.14159@classmethoddef circle_area(cls, radius):  # cls代表类本身"""类方法:计算圆面积"""return cls.PI * radius ** 2@classmethoddef set_pi(cls, new_pi):"""修改类属性"""cls.PI = new_pi# 使用
print(MathUtils.circle_area(5))  # 通过类调用: 78.53975
print(MathUtils.PI)              # 输出: 3.14159MathUtils.set_pi(3.14)
print(MathUtils.circle_area(5))  # 输出: 78.5
  • 静态方法

通过使用@staticmethod

class StringUtils:@staticmethoddef reverse_string(s):"""静态方法:反转字符串"""return s[::-1]@staticmethoddef is_palindrome(s):"""检查是否是回文"""return s == s[::-1]# 使用
print(StringUtils.reverse_string("hello"))  # 输出: olleh
print(StringUtils.is_palindrome("radar"))   # 输出: True# 也可以通过实例调用
utils = StringUtils()
print(utils.reverse_string("world"))  # 输出: dlrow

2.2.方法参数

  • 位置参数
class User:def register(self, username, password, email):"""位置参数"""self.username = usernameself.password = passwordself.email = emailuser = User()
user.register("alice", "secret", "alice@email.com")
  • 默认参数
class User:def register(self, username, password, email, is_active=True, role="user"):"""带默认值的参数"""self.username = usernameself.password = passwordself.email = emailself.is_active = is_activeself.role = roleuser = User()
user.register("bob", "password", "bob@email.com")  # 使用默认值
user.register("admin", "admin123", "admin@email.com", False, "admin")
  • 关键字参数
class Config:def set_config(self, **kwargs):"""关键字参数"""for key, value in kwargs.items():setattr(self, key, value)config = Config()
config.set_config(host="localhost", port=8080, debug=True)
print(config.host)  # 输出: localhost
  • 可变位置参数
class Calculator:def sum_all(self, *args):"""可变位置参数"""return sum(args)def average(self, *args):"""计算平均值"""if not args:return 0return sum(args) / len(args)calc = Calculator()
print(calc.sum_all(1, 2, 3, 4, 5))  # 输出: 15
print(calc.average(10, 20, 30))     # 输出: 20.0

2.3.特殊方法

  • 构造和析构方法
class FileHandler:def __init__(self, filename):"""构造方法"""self.filename = filenameself.file = open(filename, 'r')print(f"文件 {filename} 已打开")def __del__(self):"""析构方法"""if hasattr(self, 'file') and self.file:self.file.close()print(f"文件 {self.filename} 已关闭")# 使用
handler = FileHandler("test.txt")
# 当对象被销毁时自动调用__del__
  • 字符串表示方法
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):"""用户友好的字符串表示"""return f"Person: {self.name}, {self.age}岁"def __repr__(self):"""开发者的字符串表示"""return f"Person('{self.name}', {self.age})"person = Person("张三", 25)
print(str(person))    # 输出: Person: 张三, 25岁
print(repr(person))   # 输出: Person('张三', 25)
  • 运算符重载方法
class Vector:def __init__(self, x, y):self.x = xself.y = ydef __add__(self, other):"""加法运算符重载"""return Vector(self.x + other.x, self.y + other.y)def __sub__(self, other):"""减法运算符重载"""return Vector(self.x - other.x, self.y - other.y)def __mul__(self, scalar):"""乘法运算符重载"""return Vector(self.x * scalar, self.y * scalar)def __eq__(self, other):"""相等运算符重载"""return self.x == other.x and self.y == other.yv1 = Vector(2, 3)
v2 = Vector(1, 2)
v3 = v1 + v2  # Vector(3, 5)
v4 = v1 * 2   # Vector(4, 6)
print(v3.x, v3.y)  # 输出: 3 5
方法类型装饰器第一个参数用途
实例方法self操作实例数据
类方法@classmethodcls操作类属性
静态方法@staticmethod工具函数
属性方法@propertyself像属性一样访问
抽象方法@abstractmethodself/cls定义接口

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

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

相关文章

数据结构05(Java)-- ( 归并排序实质,归并排序扩展问题:小和问题)

前言 本文为本小白&#x1f92f;学习数据结构的笔记&#xff0c;将以算法题为导向&#xff0c;向大家更清晰的介绍数据结构相关知识&#xff08;算法题都出自&#x1f64c;B站马士兵教育——左老师的课程&#xff0c;讲的很好&#xff0c;对于想入门刷题的人很有帮助&#x1f4…

税务专业人员能力构建与发展路径指南

CDA数据分析师证书含金量高&#xff0c;适应了未来数字化经济和AI发展趋势&#xff0c;难度不高&#xff0c;行业认可度高&#xff0c;对于找工作很有帮助。一、税务专业人员的核心能力框架能力维度关键技能要素专业工具与方法论实践输出成果税务法规应用税种政策解读、法规更新…

Linux中rsync使用与inotify实时同步配置指南

Linux中rsync使用与inotify实时同步配置指南 一、rsync 简介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系统下的一款高效数据镜像和备份工具&#xff0c;用于在本地或远程同步文件和目录。 支持本地复制、基于 SSH 的远程同步&#xff0c;以及使用自有 rsync 协议的同…

Unicode 字符串转 UTF-8 编码算法剖析

&#x1f4ca; Unicode 字符串转 UTF-8 编码算法剖析 ——从 C# char 到 C wchar_t 的编码转换原理 引用&#xff1a;UTF-8 编解码可视化分析 &#x1f50d; 1. 算法功能概述 该函数将 Unicode 字符串&#xff08;C# string&#xff09;转换为 UTF-8 编码的字节数组&#xf…

php的安全性到底怎么样

PHP作为一种流行的服务器端脚本语言&#xff0c;被广泛应用于Web开发。然而&#xff0c;由于PHP是一种较为灵活的语言&#xff0c;其安全性议题一直备受争议。在这篇文章中&#xff0c;我将从多个方面来讨论PHP的安全性&#xff0c;包括常见的安全漏洞、防范措施以及最佳实践。…

mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox loadObj加载模型 二、🍀…

SSM从入门到实战:1.6 Spring数据访问与JDBC模板

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; 06-Spring数据访问与JDBC模板 &#x1f4d6; 本文概述 本文是SSM框架系列Spri…

下一代IT服务管理:ITIL5会是什么样?

ITIL4发布到现在也就5年多时间&#xff0c;按照以往的更新节奏&#xff0c;ITIL5最早也得2027年之后。但现在IT发展的速度&#xff0c;跟以前完全不是一个量级。AI都快把我们的饭碗抢了&#xff08;开个玩笑&#xff09;&#xff0c;ITIL要是还按部就班&#xff0c;估计真要被时…

最新研究进展:2023-2025年神经机器翻译突破性成果

文章目录 一、模型架构创新 1.1 混合架构的崛起 1.2 多模态翻译的突破 1.3 大语言模型与NMT的深度融合(2023-2024) 1.4 非自回归翻译(NAT)的效率革命(2024) 二、数据与训练策略优化 2.1 低资源语言翻译的飞跃 2.2 动态数据增强技术 三、效率与部署 3.1 模型压缩与加速 3.…

OpenTelemetry WebSocket 监控终极方案:打通最后一公里

概述 OpenTelemetry&#xff0c;以下简称 OTEL&#xff0c;是由 CNCF 托管的“一站式可观测性标准”&#xff0c;把指标、链路、日志三大信号统一为单一 SDK/API&#xff0c;零侵入地采集从浏览器、移动端到后端、容器、云服务的全栈遥测数据&#xff0c;并支持 40 后端一键导…

VS Code 出现的 Web 视图加载错误和服务工作者注册失败问题解决方案

针对 VS Code 或 Cursor &#xff08;vscode系&#xff09;中出现的 Web 视图加载错误和服务工作者注册失败问题&#xff0c;以下是永久性解决方案的完整操作指南&#xff1a;解决方案步骤打开命令面板 使用快捷键 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShift…

【qml-4】qml与c++交互(类型多例)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例注入&#xff09; 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试&#xff08;类型注册&#xff09; 【qml-4】qml与c交互&#xff08;类型多例&#xff09; 【qml-5】qml与c交互&#…

图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库

随着 Web3 生态的不断演进&#xff0c;链上风险呈现出团伙化、隐蔽化和动态化的趋势&#xff0c;传统的单点风控手段已难以应对复杂多变的攻击模式。尤其在批量注册薅羊毛与链上交易盗转洗钱等高频风险场景中&#xff0c;攻击者往往通过伪造身份、跨链操作、多层嵌套转账等方式…

恒流源电路学习

恒流源的设计原理&#xff1a; 如图所示你可以看到右边的的推到公式得到红点处的电压是一个和左边相关的定值&#xff0c;所以呢右边的电流就是电压除以那个4Ω&#xff0c;所以得到右边的电路的电流大体是一个定值&#xff0c;不管你再加什么东西都可以保持这个电流&#xff…

基于生成对抗网络的模糊图像恢复原理与技术实现

1. 引言图像模糊是数字图像处理中的常见问题&#xff0c;其成因包括相机抖动、物体运动、聚焦不良等。传统方法如维纳滤波、Lucy-Richardson 算法等依赖于模糊核估计和逆滤波&#xff0c;在复杂场景下性能有限。生成对抗网络&#xff08;Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 变更修复

FE 恢复 异常日志 查看 fe.out 会有以下报错&#xff0c;此时 fe 进程是无法启动的&#xff0c;操作前注意备份所有 fe 的元数据并停止上游读写动作&#xff01; java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系统应用收不到开机广播

安卓14系统应用收不到开机广播 - Wesley’s Blog 前段时间有测试反馈在安卓14 上面某系统应用恢复出厂设置后没有自启动&#xff0c;究竟是什么原因呢&#xff1f; 回顾 Android 从3.1开始&#xff0c;会将新安装并且从未被启动的应用置为“STOPPED”状态&#xff0c;或者被…

C# Attribute 方法扩展

场景 刚写完一个干净利落的方法&#xff0c;比如保存数据到数据库&#xff0c;逻辑清晰、结构优雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完数据&#xff0c;记得给客户发个邮件哦~” 第三天&#xff0c;“能不能再发个消息通知其他系统&#xff1f;” 第四天&am…

【URP】[法线贴图]为什么主要是蓝色的?

【从UnityURP开始探索游戏渲染】专栏-直达 法线贴图呈现蓝紫色调&#xff08;尤其以蓝色为主&#xff09;是由其‌存储原理、切线空间坐标系设计及颜色编码规则共同决定的‌。 核心原因&#xff1a;法线向量的存储规则‌ ‌法线向量的物理范围‌ 法线是单位向量&#xff0c;…

驱动开发系列63 - NVIDIA 开源GPU驱动open-gpu-kernel-modules编译调试

目录 一:通过apt方式安装nvidia 驱动 二:通过 .run 方式安装nvidia驱动 三:编译安装nvidia开源内核驱动 四:验证和调试 五:卸载驱动 1. 以apt方式安装nvidia 驱动的卸载方法 2. 以.run方式安装nvidia驱动的卸载方法 六:安装CUDA环境 一:通过apt方式安装nvidia 驱动…