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

【Python知识】Python面向对象编程知识

Python面向对象编程知识

    • 概述
      • 1. 类(Class)
      • 2. 对象(Object)
      • 3. 封装(Encapsulation)
      • 4. 继承(Inheritance)
      • 5. 多态(Polymorphism)
      • 6. 抽象(Abstraction)
      • 7. 静态方法和类方法
        • 静态方法(Static Methods)
        • 类方法(Class Methods)
        • 实例方法(Instance Methods)
        • 总结
      • 8. 属性(Properties)
      • 9. 构造函数和析构函数
      • 10. 私有和受保护成员
      • 11. 数据描述符和非数据描述符
      • 12. 元类(Metaclasses)
      • 最佳实践
    • 参考文献

概述

面向对象编程(Object-Oriented Programming,简称OOP)是Python的一种编程范式,它使用“对象”来设计软件。在OOP中,对象是类的实例,而类则定义了对象的属性和方法。OOP的核心思想是将数据(属性)和操作数据的方法(函数)封装在一起,形成一个独立的、可重用的单元。

以下是Python中面向对象编程的一些基本概念和特性:

1. 类(Class)

类是创建对象的蓝图或模板。它定义了对象的属性(数据)和方法(函数)。

class Dog:def __init__(self, name, age):self.name = name  # 实例属性self.age = age    # 实例属性def bark(self):print(f"{self.name} says woof!")  # 实例方法

2. 对象(Object)

对象是类的实例。创建对象时,会调用类的构造函数(__init__方法)来初始化对象的属性。

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

3. 封装(Encapsulation)

封装是将数据和操作数据的方法绑定在一起,形成一个独立的单元。在Python中,这通常通过类和方法来实现。封装可以提高代码的安全性和可维护性。

4. 继承(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!"d = Dog("Rex")
print(d.speak())  # 输出: Rex says woof!

5. 多态(Polymorphism)

多态允许不同类的对象通过相同的接口调用方法。在Python中,由于动态类型系统和鸭子类型(duck typing),多态性通常更容易实现。

def animal_speak(animal):print(animal.speak())animal_speak(d)  # 输出: Rex says woof!

6. 抽象(Abstraction)

抽象是隐藏复杂实现细节,只暴露必要的接口。在Python中,抽象通常通过定义抽象基类(使用abc模块)或接口类(虽然Python没有正式的接口概念,但可以通过抽象方法模拟)来实现。

from abc import ABC, abstractmethodclass Shape(ABC):@abstractmethoddef area(self):passclass Circle(Shape):def __init__(self, radius):self.radius = radiusdef area(self):return 3.14159 * (self.radius ** 2)circle = Circle(5)
print(circle.area())  # 输出圆的面积

7. 静态方法和类方法

在Python中,静态方法和类方法是类中的两种特殊方法,它们与实例方法有所不同。以下是它们的详细解释:

静态方法(Static Methods)

静态方法不需要访问类的属性或方法,也不需要访问实例的属性或方法。它们仅仅是与类相关联的函数,可以通过类名或实例名调用。在定义静态方法时,我们使用@staticmethod装饰器。

class MyClass:@staticmethoddef static_method():print("This is a static method")# 通过类名调用静态方法
MyClass.static_method()  # 输出: This is a static method# 通过实例名调用静态方法(不推荐,但允许)
obj = MyClass()
obj.static_method()  # 输出: This is a static method

静态方法通常用于在逻辑上属于类,但不需要访问类或实例状态的函数。

类方法(Class Methods)

类方法需要访问类的属性或方法,但不需要访问实例的属性。它们接受类作为第一个参数(通常命名为cls),并且可以通过类名或实例名调用。在定义类方法时,我们使用@classmethod装饰器。

class MyClass:class_variable = "I am a class variable"@classmethoddef class_method(cls):print(f"This is a class method. Class variable: {cls.class_variable}")# 通过类名调用类方法
MyClass.class_method()  # 输出: This is a class method. Class variable: I am a class variable# 通过实例名调用类方法(不推荐,但允许)
obj = MyClass()
obj.class_method()  # 输出: This is a class method. Class variable: I am a class variable

类方法通常用于创建工厂方法或替代类的构造函数(尽管这通常不推荐,因为Python提供了更灵活的__new__方法来实现这一点)。

实例方法(Instance Methods)

为了完整性,这里也提一下实例方法。实例方法是类中最常见的方法类型,它们可以访问实例的属性和其他实例方法。实例方法的第一个参数是self,它代表调用该方法的实例对象。

class MyClass:def instance_method(self):print("This is an instance method")# 通过实例名调用实例方法
obj = MyClass()
obj.instance_method()  # 输出: This is an instance method# 注意:不能通过类名直接调用实例方法(除非在类定义中调用)
# MyClass.instance_method()  # 这会引发TypeError
总结
  • 静态方法:不需要访问类或实例的属性或方法。使用@staticmethod装饰器。
  • 类方法:需要访问类的属性或方法,但不需要访问实例的属性。使用@classmethod装饰器,第一个参数是cls
  • 实例方法:可以访问实例的属性和其他实例方法。第一个参数是self

选择使用哪种方法取决于你的具体需求,以及是否需要访问类或实例的状态。

8. 属性(Properties)

在Python中,属性提供了一种访问对象属性的方式,同时可以在获取或设置属性值时执行额外的逻辑。这通常通过@property装饰器来实现。

class Celsius:def __init__(self, temperature=0):self._temperature = temperature@propertydef temperature(self):print("Getting value...")return self._temperature@temperature.setterdef temperature(self, value):if value < -273.15:raise ValueError("Temperature below -273.15 is not possible.")print("Setting value...")self._temperature = valuec = Celsius()
print(c.temperature)  # 输出: Getting value... 0
c.temperature = -300  # 引发 ValueError
c.temperature = 25    # 输出: Setting value...
print(c.temperature)  # 输出: Getting value... 25

9. 构造函数和析构函数

  • 构造函数__init__方法用于在创建对象时初始化对象的属性。
  • 析构函数__del__方法在对象被垃圾回收时调用,用于执行清理操作(如关闭文件、释放资源等)。但请注意,由于Python的垃圾回收机制,析构函数的调用时间是不确定的。
class FileHandler:def __init__(self, filename):self.file = open(filename, 'w')def __del__(self):self.file.close()print("File closed.")# 使用FileHandler时,文件会在对象被销毁时自动关闭
# 但通常建议使用with语句来确保文件被正确关闭

10. 私有和受保护成员

在Python中,没有严格的私有成员概念。但是,按照惯例,以下划线开头的名称被视为“受保护的”或“私有的”,意味着它们不应该被外部代码直接访问。

class MyClass:def __init__(self):self._private_var = "I am private"def get_private_var(self):return self._private_var# 尽管可以这样做,但通常不建议直接访问_private_var
# obj = MyClass()
# print(obj._private_var)  # 输出: I am private

11. 数据描述符和非数据描述符

描述符是一种特殊类型的对象,它定义了对象的属性访问方法(__get__, __set__, __delete__)。数据描述符是同时定义了__get____set__方法的描述符,而非数据描述符只定义了__get__方法(或至少没有定义__set__方法)。

class MyDescriptor:def __init__(self, initial_value=None, name='myvar'):self.value = initial_valueself.name = namedef __get__(self, instance, owner):print(f'Getting: {self.name}')return self.valuedef __set__(self, instance, value):print(f'Setting: {self.name} = {value}')self.value = valueclass MyClass:my_var = MyDescriptor(10)obj = MyClass()
print(obj.my_var)  # 输出: Getting: myvar 10
obj.my_var = 20    # 输出: Setting: myvar = 20
print(obj.my_var)  # 输出: Getting: myvar 20

12. 元类(Metaclasses)

元类是创建类的“类”。它们允许你控制类的创建过程,并可以添加额外的功能或修改类的行为。在Python中,元类通过继承type(所有类的默认元类)来定义。

class MyMeta(type):def __new__(cls, name, bases, dct):print(f"Creating class {name}")return super().__new__(cls, name, bases, dct)class MyClass(metaclass=MyMeta):pass# 输出: Creating class MyClass

最佳实践

  • 遵循PEP 8:Python的官方样式指南PEP 8提供了关于如何编写清晰、可读的Python代码的建议。
  • 保持类和方法简短:尽量使类和方法保持简短和专注。如果一个方法变得太复杂,考虑将其拆分为多个更小的方法。
  • 使用文档字符串:为类和方法编写文档字符串,以解释它们的用途、参数和返回值。
  • 避免过度使用继承:虽然继承是OOP的一个强大特性,但过度使用可能会导致代码难以理解和维护。考虑使用组合(composition)而不是继承来实现代码重用。
  • 测试你的代码:编写单元测试来验证你的类和方法的行为是否符合预期。

通过这些高级特性和最佳实践,你可以更有效地利用Python的面向对象编程功能来构建健壮、可维护和可扩展的软件系统。

参考文献

【Python知识】Python基础-python基本语法入门
【Python知识】Windows下python安装以及多版本管理

相关文章:

【Python知识】Python面向对象编程知识

Python面向对象编程知识 概述1. 类&#xff08;Class&#xff09;2. 对象&#xff08;Object&#xff09;3. 封装&#xff08;Encapsulation&#xff09;4. 继承&#xff08;Inheritance&#xff09;5. 多态&#xff08;Polymorphism&#xff09;6. 抽象&#xff08;Abstractio…...

CSharp: Oracle Stored Procedure query table

存储过程查询postgreSQL,Oracle 和sql server,Mysql 有区别。程序调用也是有区别。 oracle sql script: CREATE OR REPLACE PROCEDURE procSelectSchool(paramSchoolId IN char,p_cursor OUT SYS_REFCURSOR ) AS BEGINOPEN p_cursor FORSELECT *FROM SchoolWHERE SchoolId p…...

“协同过滤技术实战”:网上书城系统的设计与实现

2.1 JSP技术介绍 Java Server Pages这三个英文词汇的首字母的组合就是JSP。所以JSP是一个简写的名字&#xff0c;代表动态网页开发技术。JSP与Java的关系可以使用公式表示&#xff0c;即&#xff1a;JSP HTMLJava&#xff0c;HTML就是编写静态内容的标记语言。JSP则是可以编写网…...

Dhatim FastExcel 读写 Excel 文件

Dhatim FastExcel 读写 Excel 文件 一、说明1、主要特点2、应用场景 二、使用方法1、引入依赖2、Sheet 数据3、读取 Excel4、写入 Excel 一、说明 Github 地址&#xff1a;Dhatim FastExcel Dhatim FastExcel是一个高性能、轻量级的Java库&#xff0c;专门用于读取和写入Exce…...

YOLO11全解析:从原理到实战,全流程体验下一代目标检测

前言 一、模型介绍 二、网络结构 1.主干网络&#xff08;Backbone&#xff09; 2.颈部网络&#xff08;Neck&#xff09; 3.头部网络&#xff08;Head&#xff09; 三、算法改进 1.增强的特征提取 2.优化的效率和速度 3.更高的准确性与更少的参数 4.环境适应性强 5.…...

深度学习领域的主要神经网络架构综述

阅读本文前请先按照顺序阅读&#xff1a; Coursera吴恩达《神经网络与深度学习》课程笔记&#xff08;1&#xff09;-- 深度学习概述_吴恩达深度学习课程-CSDN博客 https://blog.csdn.net/red_stone1/article/details/77799014 完结篇 | 吴恩达deeplearning.ai专项课程精炼笔…...

【Nginx系列】---Nginx配置tcp转发

参考 Nginx 配置文件&#xff1a; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;events {worker_connections 1024; }stream {# 第一个服务转发upstream mysqltest {server 172.16.187.142:9000;}server {listen 9000;proxy_pass mysqltest;}…...

Java抽象工厂+单例模式

在前端时间开发过程中,有这样一个业务场景:A;B两家厂商设备进行设备信息的同步功能。 根据实际场景,做了抽象工厂+单例模式实现调用工厂时,生成不同的具体业务引用对象,实现方法的调用。 概念: 抽象工厂模式通过接口或抽象类来创建一系列相关或依赖对象。它定义了一组工…...

后端接口设计

一、基本规范 1.URL设计 应遵循RESTful风格&#xff0c;使用动词名词的方式描述接口的功能。应简洁明了&#xff0c;易于理解和记忆。 2.请求协议及方法 使用HTTPS协议进行数据传输&#xff0c;保证数据在传输过程中的安全性。如无特殊情况&#xff0c;统一使用post方法。 …...

Docker部署Sentinel

一、简介 是什么&#xff1a;面向分布式、多语言异构化服务架构的流量治理组件 能干嘛&#xff1a;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性 官网地址&#xff1a;https://sentinelguard.io/zh-c…...

真实环境下实车运行,新能源汽车锂离子电池数据集

引言 锂离子电池(Lithium-ion Batteries,LiBs&#xff09;已经作为电动汽车核心动力源&#xff0c;其性能直接关系到系统的性能和使用安全。为确保锂电池的安全使用&#xff0c;需要对锂电池的状态进行精确的估计&#xff0c;包括荷电状态(State of Charge, soC)、健康状态(St…...

【求职面试】驾照的种类

大型客车 A1 大型载客汽车 A3、B1、B2、C1、C2、C3、C4、M 牵引车 A2 重型、中型全挂、半挂汽车列车 B1、B2、C1、C2、C3、C4、M 城市公交车 A3 核载10人以上的城市公共汽车 C1、C2、C3、C4 中型客车 B1 中型载客汽车&#xff08;10人以上、19人以下&#xff09; C1、C2、C3…...

centos权限大集合,覆盖多种权限类型,解惑权限后有“. + t s”问题!

在 CentOS 系统中&#xff0c;权限管理是操作系统的核心功能之一&#xff0c;确保不同用户和进程对文件、目录以及设备的访问被合理控制。 权限系统主要包括传统的 Unix 权限模型、特殊权限&#xff08;SetUID、SetGID、Sticky 位&#xff09;和更精细的访问控制列表&#xff…...

AI Agent案例全解析:百度营销智能体(8/30)

引言&#xff1a;在当今这个科技飞速发展的时代&#xff0c;AI技术呈现出爆发式的增长&#xff0c;正以前所未有的态势改变着众多行业的发展轨迹&#xff0c;营销领域也不例外。随着市场竞争的日益激烈&#xff0c;传统营销模式逐渐显露出疲态&#xff0c;对于变革的需求愈发迫…...

hive常用函数有哪些

Hive是一个基于Hadoop的数据仓库工具&#xff0c;它提供了类似于SQL的接口&#xff0c;用于数据查询和分析。Hive提供了许多内置函数&#xff0c;这些函数可以分为几种类型&#xff0c;包括&#xff1a; • 字符串函数&#xff1a;用于处理字符串数据。 • concat()&#xff1…...

【Python高级353】python实现多线程版本的TCP服务器

前面学了了套接字编程、tcp服务端客户端开发、面向对象版的服务端客户端、带有端口复用的服务端。 这里使用多线程开发多任务版的服务端 多任务版本的TCP服务器 来一个客户&#xff0c;就为其创建一个线程 import socket import threadingclass WebServer:# 3、定义一个__ini…...

分布式调度框架学习笔记

一、分布式调度框架的基本设计 二、线程池线程数量设置的基本逻辑 cpu是分时复用的方法&#xff0c;线程是cpu调度的最小单元 如果当前cpu核数是n&#xff0c;计算密集型线程数一般设为n&#xff0c;io密集型(包括磁盘io和网络io)线程数一般设置为2n. 计算密集型线程数一般设…...

SpringCloudAlibaba技术栈-Nacos

1、什么是Nacos&#xff1f; Nacos是个服务中心&#xff0c;就是你项目每个功能模块都会有个名字&#xff0c;比如支付模块,我们先给这个模块起个名字就叫paymentService,然后将这个名字和这个模块的配置放到Nacos中&#xff0c;其他模块也是这样的。好处是这样能更好地管理项…...

Redis篇--常见问题篇4--大Key(Big Key,什么是大Key,影响及使用建议)

1、概述 大Key&#xff1a;通常是指值&#xff08;Value&#xff09;的长度非常大&#xff0c;实际上键&#xff08;Key&#xff09;长度很大也算。通常来说&#xff0c;键本身不会很长&#xff0c;占用的内存较少&#xff0c;因此判断一个键是否为bigKey主要看它对应的值的大…...

谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持

问题现象 在Chrome 高版本上的扩展管理页面&#xff08;地址栏输入chrome://extensions/或者从界面进入&#xff09;&#xff1a; &#xff0c; 可以查看到扩展的情况。 问题现象大致如图: 问题原因 出现此问题的根本原因在于&#xff1a;谷歌浏览器本身的扩展机制发生了…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...