探索【Python面向对象】编程:新时代的高级编程范式详解

目录

1. 面向对象编程概念(OOP)

1.1 什么是类和对象?

1.2 类的定义

1.3 类和对象的关系

1.4 小李的理解

2. 抽象

2.1 抽象的概念

2.2 抽象类和方法

2.3 小李的理解

3. 类和实例

3.1 类的定义和实例化

3.2 类的属性和方法

3.3 小李的理解

4. 封装/接口

4.1 封装的概念

4.2 接口的概念

4.3 小李的理解

5. 继承

5.1 继承的概念

5.2 方法重写

5.3 小李的理解

6. 多态

6.1 多态的概念

6.2 实现多态

6.3 小李的理解

7. 自省/反射

7.1 自省的概念

7.2 使用自省进行动态操作

7.3 小李的理解

8. 静态方法和类方法

8.1 静态方法

8.2 类方法

总结


 

专栏:python学习笔记 

上一卷:Python模块化与包管理

1. 面向对象编程概念(OOP)

面向对象编程(OOP) 是一种编程范式,通过将程序组织成对象的集合来实现。对象不仅包含数据,还包含操作这些数据的方法。OOP的核心概念包括类、对象、属性和方法。

1.1 什么是类和对象?

  • 类(Class) 是一个模板或蓝图,用来创建对象。类定义了对象的属性和行为。
  • 对象(Object) 是类的实例。创建对象就是根据类创建一个具体的实例。

例子:

class Dog:
    # 类的初始化方法
    def __init__(self, name, age):
        self.name = name  # 属性
        self.age = age    # 属性

    # 方法
    def bark(self):
        return f"{self.name} says Woof!"

# 创建对象
my_dog = Dog("Rex", 5)
print(my_dog.bark())

1.2 类的定义

在Python中,类通过 class 关键字定义。类中的函数称为方法,变量称为属性。类的方法通常以 self 作为第一个参数,表示实例本身。

例子:

class Cat:
    def __init__(self, name):
        self.name = name

    def meow(self):
        return f"{self.name} says Meow!"

# 创建对象
my_cat = Cat("Whiskers")
print(my_cat.meow())

1.3 类和对象的关系

类是对象的模板,定义了对象的结构和行为。而对象是类的实例,每个对象都有独立的属性和方法。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        return f"Hello, my name is {self.name} and I am {self.age} years old."

# 创建多个对象
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)

print(person1.greet())
print(person2.greet())

1.4 小李的理解

类就像是制作饼干的模具,它定义了饼干的形状和尺寸。而对象就像是用模具做出的具体饼干,每块饼干可以有不同的口味(属性),但它们的形状和尺寸(结构和行为)都是相同的。

2. 抽象

抽象 是指对现实世界的复杂问题进行简化,通过抓住主要特征而忽略细节。在编程中,抽象帮助我们创建更加简洁和易维护的代码。

2.1 抽象的概念

抽象就是提取对象的主要特征,而忽略不重要的细节。通过抽象,我们可以专注于对象的核心功能,而不被次要特征所干扰。

例子:

class Animal:
    def __init__(self, name):
        self.name = name

    def make_sound(self):
        pass  # 抽象方法,不具体实现

class Dog(Animal):
    def make_sound(self):
        return "Woof!"

class Cat(Animal):
    def make_sound(self):
        return "Meow!"

# 创建对象
dog = Dog("Rex")
cat = Cat("Whiskers")

print(dog.make_sound())
print(cat.make_sound())

2.2 抽象类和方法

在Python中,我们可以通过定义抽象类和抽象方法来实现抽象。抽象类不能被实例化,只能被继承。抽象方法在抽象类中定义,但在子类中实现。

例子:

from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start_engine(self):
        pass

class Car(Vehicle):
    def start_engine(self):
        return "Car engine started"

class Motorcycle(Vehicle):
    def start_engine(self):
        return "Motorcycle engine started"

# 创建对象
car = Car()
motorcycle = Motorcycle()

print(car.start_engine())
print(motorcycle.start_engine())

2.3 小李的理解

抽象就像是把一幅复杂的画简化为几何图形。比如,一只具体的猫有很多特征(毛色、大小、年龄等),但我们只关注它会喵喵叫的特点,这就是对猫进行的抽象。

3. 类和实例

类和实例 是OOP的基础。类是模板,实例是具体对象。实例通过类创建,具有类定义的属性和方法。

3.1 类的定义和实例化

定义类并创建实例是OOP的基本操作。类定义了属性和方法,而实例则是类的具体对象。

例子:

class Student:
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade

    def introduce(self):
        return f"Hi, I am {self.name} and I am in grade {self.grade}."

# 创建实例
student1 = Student("Alice", 10)
student2 = Student("Bob", 12)

print(student1.introduce())
print(student2.introduce())

3.2 类的属性和方法

类的属性是对象的状态,方法是对象的行为。类的属性通过 __init__ 方法初始化,方法在类中定义。

例子:

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    def get_info(self):
        return f"'{self.title}' by {self.author}"

# 创建实例
book = Book("1984", "George Orwell")
print(book.get_info())

3.3 小李的理解

类和实例就像是房子的图纸和实际的房子。图纸(类)定义了房子的结构和功能,而实际的房子(实例)则是根据图纸建造的具体对象。

4. 封装/接口

封装 是将对象的状态(属性)和行为(方法)隐藏在类内部,通过接口(方法)与外界交互。封装提高了代码的安全性和可维护性。

4.1 封装的概念

封装是OOP的核心概念之一,它通过隐藏对象的内部状态,只暴露必要的接口,来保护对象的数据。这样,外部代码不能直接访问或修改对象的内部状态,只能通过对象提供的方法来操作数据。

例子:

class Account:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.__balance = balance  # 私有属性

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
        else:
            raise ValueError("Deposit amount must be positive")

    def withdraw(self, amount):
        if 0 < amount <= self.__balance:
            self.__balance -= amount
        else:
            raise ValueError("Insufficient funds or invalid amount")

    def get_balance(self):
        return self.__balance

# 创建实例
account = Account("John")
account.deposit(100)
print(account.get_balance())

4.2 接口的概念

接口是对象与外部交互的唯一方式。通过接口,外部代码可以调用对象的方法,而不能直接访问对象的内部状态。

例子:

class Car:
    def __init__(self, model):
        self.model = model
        self.__engine_started = False

    def start_engine(self):
        if not self.__engine_started:
            self.__engine_started = True
            return "Engine started"
        else:
            return "Engine is already running"

    def stop_engine(self):
        if self.__engine_started:
            self.__engine_started = False
            return "Engine stopped"
        else:
            return "Engine is not running"

# 创建实例
car = Car("Toyota")
print(car.start_engine())
print(car.stop_engine())

4.3 小李的理解

封装就像是手机的外壳。手机内部的电路和元件(对象的状态)被封装在外壳里面,用户只能通过按键和屏幕(接口)与手机交互,而无法直接接触内部的元件。

5. 继承

继承 是OOP的另一个核心概念,它允许我们基于一个现有的类创建一个新的类,新类继承了现有类的所有属性和方法。

5.1 继承的概念

继承是指一个类(子类)从另一个类(父类)获取属性和方法。通过继承,子类可以复用父类的代码,同时可以添加新的属性和方法,或重写父类的方法。

例子:

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

# 创建实例
dog = Dog("Rex")
cat = Cat("Whiskers")

print(dog.speak())
print(cat.speak())

5.2 方法重写

子类可以重写父类的方法,即在子类中定义与父类同名的方法,从而实现不同的功能。

例子:

class Shape:
    def area(self):
        return 0

class Rectangle(Shape):
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def area(self):
        return self.width * self.height

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * (self.radius ** 2)

# 创建实例
rectangle = Rectangle(3, 4)
circle = Circle(5)

print(rectangle.area())
print(circle.area())

5.3 小李的理解

继承就像是父母给孩子的遗产。父母(父类)把他们的财产(属性和方法)传给孩子(子类),孩子不仅可以使用这些财产,还可以通过自己的努力(添加新属性和方法)变得更加富有。

6. 多态

多态 是指同一个方法在不同的对象上具有不同的表现形式。多态允许我们通过同一个接口调用不同对象的方法,从而实现不同的功能。

6.1 多态的概念

多态是OOP的重要特性之一,它通过父类引用指向子类对象,使得同一方法可以有不同的实现。多态提高了代码的灵活性和可扩展性。

例子:

class Animal:
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

class Cat(Animal):
    def speak(self):
        return "Meow!"

def animal_sound(animal):
    print(animal.speak())

# 创建实例
dog = Dog()
cat = Cat()

animal_sound(dog)
animal_sound(cat)

 

6.2 实现多态

在Python中,多态通常通过方法重写和父类引用来实现。通过父类引用指向子类对象,可以调用子类的方法。

例子:

class Shape:
    def draw(self):
        pass

class Rectangle(Shape):
    def draw(self):
        return "Drawing a rectangle"

class Circle(Shape):
    def draw(self):
        return "Drawing a circle"

def draw_shape(shape):
    print(shape.draw())

# 创建实例
rectangle = Rectangle()
circle = Circle()

draw_shape(rectangle)
draw_shape(circle)

 

6.3 小李的理解

多态就像是万能遥控器。无论是控制电视、空调还是音响,只要这些设备有相应的接口(方法),遥控器(父类引用)就能通过相同的按键(方法调用)实现不同的功能。

7. 自省/反射

自省 是指对象在运行时能够知道自己的信息。Python提供了一些内置函数用于自省,如 type()id()hasattr() 等。

7.1 自省的概念

自省是指对象能够在运行时获取自身的信息,如属性、方法等。自省使得Python程序具有高度的动态性和灵活性。

例子:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

person = Person("Alice", 30)

# 使用内置函数进行自省
print(type(person))
print(hasattr(person, "name"))
print(getattr(person, "name"))
setattr(person, "name", "Bob")
print(person.name)
delattr(person, "name")

7.2 使用自省进行动态操作

通过自省,我们可以在运行时动态地操作对象的属性和方法,使得程序更加灵活和动态。

例子:

class Car:
    def __init__(self, model):
        self.model = model
        self.speed = 0

    def accelerate(self):
        self.speed += 5
        return self.speed

car = Car("Toyota")

# 动态操作对象
if hasattr(car, "accelerate"):
    method = getattr(car, "accelerate")
    print(method())
    print(method())

# 动态设置属性
setattr(car, "color", "red")
print(car.color)

7.3 小李的理解

自省就像是人在照镜子。通过镜子(自省机制),人可以看到自己的样子(对象的属性和方法),并根据需要进行调整(动态操作对象)。

8. 静态方法和类方法

静态方法类方法 是与类相关联的方法,而不是与实例相关联的方法。静态方法使用 @staticmethod 装饰器,类方法使用 @classmethod 装饰器。

8.1 静态方法

静态方法是类的一个方法,但它不与任何类实例绑定。静态方法不能访问类的实例,也不能修改类的状态。它们通常用于执行一些与类无关的操作,但逻辑上属于类的功能。

例子:

class Math:
    @staticmethod
    def add(a, b):
        return a + b

print(Math.add(5, 3))

 

8.2 类方法

类方法是绑定到类而不是实例的方法。类方法的第一个参数是类本身,通常命名为 cls。类方法可以访问类的属性和其他类方法。

例子:

class Math:
    factor = 2

    @classmethod
    def multiply(cls, value):
        return cls.factor * value

print(Math.multiply(5))

总结

Python的面向对象编程的各个方面,包括面向对象编程的基本概念、抽象、类和实例、封装、继承、多态、自省以及静态方法和类方法。

希望这篇详细的博客能帮助你深入理解Python的面向对象编程,并在实际项目中应用这些知识。如果你有任何问题或需要进一步的帮助,请随时与我联系!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt 统计图编程

学习目标&#xff1a;Qt 折线图&#xff0c;柱形图和扇形统计图编程 学习基础 Qt QChart 曲线图表操作-CSDN博客 学习内容 Qt中绘制三种常见的图表非常方便, 主要步骤如下: 1. 折线图: - 使用QLineSeries定义折线数据,添加多个坐标点 - 使用QValueAxis创建X轴和Y轴 - 将…

SpringBoot运维篇

工程打包与运行 windows系统 直接使用maven对项目进行打包 jar支持命令行启动需要依赖maven插件支持&#xff0c;打包时须确认是否具有SpringBoot对应的maven插件 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><ar…

TCP协议的三次握手和四次挥手(面试)

三次握手 首先可以简单的回答&#xff1a; 1、第一次握手&#xff1a;客户端给服务器发送一个 SYN 报文。 2、第二次握手&#xff1a;服务器收到 SYN 报文之后&#xff0c;会应答一个 SYNACK 报文。 3、第三次握手&#xff1a;客户端收到 SYNACK 报文之后&#xf…

redis介绍与布署

redis remote dictionary server&#xff08;远程字典服务器&#xff09; 是一个开源的&#xff0c;使用c语言编写的非关系型数据库&#xff0c;支持内存运行并持久化&#xff0c;采用key-value的存储形式。 单进程模型意味着可以在一台服务器上启动多个redis进程&#xff0c;…

利用js实现图片压缩功能

图片压缩在众多应用场景中扮演着至关重要的角色&#xff0c;尤其是在客户端上传图片时。原始图片往往体积庞大&#xff0c;直接上传不仅消耗大量带宽资源&#xff0c;还可能导致上传速度缓慢&#xff0c;严重影响用户体验。因此&#xff0c;在图片上传至服务器前对其进行压缩处…

uni-app iOS上架相关App store App store connect 云打包有次数限制

相册权限 uni-app云打包免费有次数 切换一个账号继续

[人工智能]对未来建筑行业的影响

作者主页: 知孤云出岫 目录 引言1. 人工智能在建筑行业的应用场景1.1 设计阶段1.2 施工阶段1.3 运营和管理 2. 关键技术2.1 机器学习2.2 计算机视觉2.3 自然语言处理2.4 大数据分析 3. 实际案例分析3.1 案例1&#xff1a;利用GAN生成建筑设计方案3.2 案例2&#xff1a;利用计算…

实验03 黑盒测试方法(因果图、决策表)

知识点 决策表法 决策表概念&#xff1a;一种分析多逻辑条件下不同操作的工具。在所有的黑盒测试方法中&#xff0c;基于决策表&#xff08;也称判定表&#xff09;的测试是最为严格、最具有逻辑性的测试方法。优点&#xff1a;能够全面列举所有可能情况&#xff0c;避免遗漏…

Qt项目中添加自定义文件夹,进行整理归类

Qt项目中添加文件夹进行归类 1、在windows的工程目录下创建一个文件夹&#xff0c;如widgets 2、将.h 、.cpp、.ui文件拷贝到windows该文件夹widgets 3、在qt工程中&#xff0c;根目录右键&#xff0c;选择添加现有文件&#xff0c;批量选择 .h 、.cpp、.ui文件之后&#xf…

[数字图像处理]基础知识整理(部分,持续更新)

程序中描述一副图像&#xff0c;已知其横向纵向的像素个数即可&#xff08;&#xff09; 灰度直方图能反映一副图像各个灰度级像素占图像的面积比&#xff08;√&#xff09; 从程序编写的角度看&#xff0c;描述一副图像的基本属性通常包括其分辨率&#xff0c;即图像的宽度…

1、项目目录设计

文章目录 前言一、项目目录设计 前言 本项目我们将会完成一个Go项目开发框架&#xff0c;该项目不会包含具体的CRUD业务代码&#xff0c;而是从头搭建一个工作中实用的开发框架。让开发者能够熟悉整个项目的搭建流程&#xff0c;能够独立完成项目从0到1的搭建&#xff0c;而且…

数据结构实操代码题~考研

作者主页: 知孤云出岫 目录 数据结构实操代码题题目一&#xff1a;实现栈&#xff08;Stack&#xff09;题目二&#xff1a;实现队列&#xff08;Queue&#xff09;题目三&#xff1a;实现二叉搜索树&#xff08;BST&#xff09;题目四&#xff1a;实现链表&#xff08;Linked…

LayoutLMv2:视觉丰富文档理解的多模态预训练

文本和布局的预训练由于其有效的模型架构和大规模未标记扫描/数字出生文档的优势&#xff0c;在各种视觉丰富的文档理解任务中被证明是有效的。我们提出了具有新的预训练任务的LayoutLMv2架构&#xff0c;以在单个多模态框架中对文本、布局和图像之间的交互进行建模。具体而言&…

网络编程学习之tcp

按下*&#xff08;星号&#xff09;可以搜索当前光标下的单词。 Tcp编程的过程 打开网络设备 Bind&#xff1a;给服务地址把ip号和端口号连接进去 Tcp是有状态的 Listen是进入监听状态&#xff0c;看有没有客户端来连接服务器 Tcp比udp消耗过多资源 Upd类似于半双工&#…

Qt图形与图片(Qt位置相关函数、Qt基础图形的绘制、双缓冲机制、显示SVG格式图片)

此篇文章介绍几种主要位置函数及其之间的区别&#xff0c;以及各种与位置相关函数的使用场合&#xff1b;然后&#xff0c;通过一个简单绘图工具实例&#xff0c;介绍利用QPainter和QPainterPath两种方法绘制各种基础图形&#xff1b;最后&#xff0c;通过几个实例介绍如何利用…

Golang | Leetcode Golang题解之第230题二叉搜索树中第K小的元素

题目&#xff1a; 题解&#xff1a; type MyBst struct {root *TreeNodenodeNum map[*TreeNode]int // 统计以每个结点为根结点的子树的结点数&#xff0c;并存储在哈希表中 }// 统计以 node 为根结点的子树的结点数 func (t *MyBst) countNodeNum(node *TreeNode) int {if…

达梦数据库dm8安装步骤及迁移

目录 前言: 一、安装部署 1、下载 2、创建用户及安装目录 3、挂载下载的镜像 4、环境配置 5、安装 二、基本使用 1、DM工具使用 2、兼容性配置 2.1 兼容GBK字符集编码 2.2 兼容UTF-8字符集编码 3、创建用户和密码,表空间 4、整理数据库配置 5、启动脚本设置 …

基于YOLOV8的数粒机视觉计数解决方案

一:行业背景调查 随着全球市场商品大规模工业化生产技术的大规模发展,其中对各类产品生产包装以及原材料供给有了更多精准计数的要求,这些要求主要分布在一些产量较大,产品颗粒较小,单个成本较高的商品中,近几年主要从医药包装领域和接插件包装领域开始对产品包装中的计…

ENSP实现防火墙区域策略与用户管理

目录 实验拓扑与要求​编辑 交换机与防火墙接口的配置 交换机&#xff1a; 创建vlan 接口配置 防火墙配置及接口配置 防火墙IP地址配置 云配置​编辑​编辑​编辑 在浏览器上使用https协议登陆防火墙&#xff0c;并操作 访问网址&#xff1a;https://192.168.100.1:844…

弥合人类与人工智能的知识差距:AlphaZero 中的概念发现和迁移(1)

文章目录 一、摘要二、简介三、相关工作3.1 基于概念的解释3.2 强化学习中生成解释3.3 国际象棋与人工智能 四、什么是概念&#xff1f;五、发掘概念5.1 挖掘概念向量5.1.1 静态概念的概念约束5.1.2 动态概念的概念约束 5.2 过滤概念 一、摘要 人工智能&#xff08;AI&#xff…