Python14 面向对象编程

2024-06-21 15:52

本文主要是介绍Python14 面向对象编程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

图片

1.什么是面向对象编程OOP

Python的面向对象编程(Object-Oriented Programming,简称OOP)是一种编程范式,它使用“对象”来设计应用程序和计算机程序。这些对象由数据和能够操作这些数据的方法组成。面向对象编程的主要目标是提高软件的可重用性、可维护性和灵活性。在Python中,面向对象编程具有以下几个核心概念:

  1. 类(Class)

    • 类是创建对象的模板或蓝图。它定义了一组属性(称为字段或变量),以及操作这些数据的方法。一个类可以包括基本的数据属性(静态的信息片段),以及能够对数据执行特定功能的方法。

  2. 对象(Object)

    • 对象是类的实例。如果类是蓝图,对象就是根据这个蓝图构建的房子。每个对象都拥有类定义的字段和方法的具体实例。即便两个对象来自同一个类,它们也可以拥有不同的数据属性。

  3. 封装(Encapsulation)

    • 封装是面向对象编程的一个主要特点,指的是将对象的数据(属性)和代码(方法)捆绑在一起,形成一个独立的单元。在封装的概念中,类通常会防止外部代码直接访问内部数据结构,而是通过方法(称为getter和setter)来操作数据,这提供了更好的数据控制和更容易的维护。

  4. 继承(Inheritance)

    • 继承允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类重用父类的代码可以减少冗余,而且子类可以扩展或修改从父类继承的行为,这提高了代码的可用性和可扩展性。

  5. 多态(Polymorphism)

    • 多态是指同一个接口支持不同的底层形态(数据类型)。在Python中,多态表现为可以通过相同的接口调用不同类的方法,具体调用哪个方法取决于调用方法的对象。比如,不同的类可能都定义了一个相同的方法名,但是每个类的该方法的具体实现可能不同。

  6. 抽象(Abstraction)

    • 抽象是简化复杂的现实问题的方法,它通常用于隐藏复杂度,只显示最相关的细节。在Python中,可以使用抽象类来定义不能直接实例化的类,这些抽象类意在专门为其他类提供基本的、通用的功能模板,具体实现则留给继承了抽象类的子类。

通过使用这些OOP原则,Python程序员能够创建可读性强、易于扩展和维护的应用程序。

2.常用方法及代码实现

① 类和对象

创建一个类,实例化一个对象并调用类中定义的方法。

# 常见的类和对象
class Foo:  # 定义一个Foo类,包含两个方法Bar和Hellodef Bar(self):  # Bar是Foo类的一个方法,不接受除 self(指向类实例本身的引用)之外的任何参数。当Bar方法调用时它会打印字符串"Cheney"print('Cheney')def Hello(self,name):  # Hello是Foo类的另一个方法,接受一个参数name以及隐式的self参数。该方法打印一句格式化字符串,其中包含传入的name参数print("我的名字是:{}".format(name))
# 根据类Foo创建一个实例对象obj        
obj=Foo()  # 变量obj按照Foo类的定义生成
obj.Bar()  # obj调用类中的Bar方法,会直接打印出"Cheney"
obj.Hello('CheneyCliff')  # obj调用类中的Hello方法,并将CheneyCliff参数传给Hello方法,最终打印出一个格式化字符串

图片

② 封装

下面的代码定义了一个名为 Foo 的类,并且在这个类中封装了两个属性:name 和 age。封装是面向对象编程的一大特性,它主要用于将数据(属性)和与数据相关的方法绑定在一起,形成一个独立的实体(对象),这样的封装可以提高代码的复用性和安全性。

# 面向对象三大特性
# 一、封装的含义顾名思义就是将内容封装到某个地方,以后再去调用被封装在该处的内容
class Foo:def __init__(self,name,age):  # __init__ 方法是一个特殊的方法,称为类的构造器。当创建类的新实例时,这个方法会被自动调用,它的主要任务是初始化对象的属性# self.name 和 self.age 是对象的两个属性,分别被赋予方法参数 name 和 age 的值self.name=nameself.age=age# 第1步:将内容封装到某处
Figure1=Foo('Gatsby',20)
Figure2=Foo('Daisy',19)
# 第2步:通过对象直接从某处调用被封装的内容
print('Figure1的name为:%s'%Figure1.name)
print('Figure2的age为:%d'%Figure2.age)

图片

③ 调用封装的内容
#第二步:2、通过self间接调用被封装的内容
class Foo:def __init__(self,name,age):  # 初始化对象属性self.name=nameself.age=agedef detail(self):  # 定义一个detial方法print(self.name)print(self.age)
obj1=Foo('Gatsby',20)  # 实例化一个对象
obj1.detail()  # 调用detail方法

图片

④ 继承

继承是面向对象三大特性之一(另外两个是封装和多态)。继承允许一个类(称为子类)继承另一个类(称为父类或基类)的属性和方法。这样做的主要好处是代码重用,可以将通用的代码放在一个父类中,通过继承机制在多个子类中复用这些代码。

# 二、继承、面向对象中的继承和现实生活中的继承相同,即:子可以继承父的内容
class Animal:  # 定义一个父类Animal# 定义父类的四个方法def eat(self):print("%s 吃"%self.name)  # 使用self.name来访问和输出动物的名称def drink(self):print("%s 喝"%self.name)def shit(self):print("%s 拉"%self.name)def pee(self):print("%s 撒"%self.name)# 定义子类
class Dog(Animal):  # Dog类继承自Animal类def __init__(self,name):self.name=name  # 初始化了狗的名字,这对于调用父类中定义的方法(如eat、drink等)是必需的self.breed='狗'def cry(self):  # 定义一个Dog类的特定行为print("汪汪汪")
class Cat(Animal):  # Cat类继承自Animal类def __init__(self,name):self.name=nameself.breed='猫'def cry(self):print("喵喵喵")
dog=Dog("Gatsby家的小狗")  # 传入狗的名称,初始化对象
dog.eat()  # 调用两次eat方法
dog.eat()
dog.cry()
cat=Cat('Daisy家的小猫')  # 传入猫的名称,初始化对象
cat.drink()

图片

⑤ 类的继承机制

在Python中,类的继承机制允许多重继承,这意味着一个类可以同时继承多个父类。这与Java和C#等其他面向对象的编程语言不同,后者仅支持单一继承,但可以通过接口来实现多继承的某些效果。在Python中,多继承引入了寻找方法和属性的顺序问题,即当一个类继承自多个父类时,Python2.X需要一个明确的规则来决定从哪个父类中寻找方法或属性,这就涉及到深度优先和广度优先的搜索策略。

在Python 2中,有经典类和新式类之分。Python 3中,所有类默认都是新式类(即使不显式继承自 object)。‘即使不显式’通常用于描述某些操作或行为在没有明确指定的情况下依然会发生的情况,这种说法帮助简化代码和提高编程效率,但同时它也要求开发者理解默认行为,以避免意外的错误。

在Python 3中,类的继承和方法解析遵循C3线性化算法。C3线性化是一种特定的算法,用于解决在具有多重继承的类体系中确定方法解析顺序的问题。这个算法确保任何类都会在其父类之前被检查,同时也保持了父类的顺序。这意味着,Python 3中不再单纯使用传统的深度优先或广度优先策略来解析方法调用

# 1.Python的类可以继承多个类,Java和C#中则只能继承一个类
# 2.Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是深度优先和广度优先
# 当类是经典类时,多继承情况下会按照深度优先方式查找
# 当类是新式类时,多继承情况下会按照广度优先方式查找
# 经典类(Python2.X):
class C1:pass
class C2(C1):pass
# 新式类(Python3.X)
# 在Python3.x中,所有的类默认继承自内置的 object 类,即使你没有在类定义中显式地指明继承自 object
# 这意味着即使不显式地声明,所有类都将继承object类的所有方法和属性,这包括基本的方法如 __str__()、__repr__() 和 __new__() 等
class N1(object):pass
class N2(N1):pass

下面展示的是一个多重继承的例子。

class D:def bar(self):print("D.bar")
class C(D):def bar(self):print("C.bar")
class B(D):def bar(self):print("B.bar")
# A是一个多重继承的类,继承自B和C。因此,它具有从这两个类继承而来的所有属性和方法
class A(B,C):def bar(self):print("A.bar")# Python查找并执行bar()方法的顺序是根据类A的方法解析顺序(MRO)。由于A自己定义了bar()方法,因此调用的就是这个方法。
a=A()
a.bar()
# 在Python中,可以使用类的mro()方法来查看方法解析顺序
print(A.mro())

图片

⑥ 多态

多态是面向对象编程(OOP)中的一个核心概念,它允许在不同类的对象上以共同的方式调用相同的方法,而具体执行什么方法则取决于调用方法的对象的实际数据类型。这使得编程更加灵活,并增强了代码的可扩展性和可维护性。多态字面意思是“多种形态”,在编程中,它允许使用者以统一的接口处理不同类型的对象。

在下面的例子中,Animal 类定义了一个 speak 方法,Dog 和 Cat 类继承自 Animal 并重写了 speak 方法。函数 animal_sound 接受一个 Animal 类型的对象,并调用它的 speak 方法。当传递 Dog 和 Cat 对象时,尽管 animal_sound 函数的参数类型是 Animal,它依然调用了实际类型对应的方法。

# 三.多态
class Animal:def speak(self):print("Some sound")class Dog(Animal):def speak(self):print("Woof woof")class Cat(Animal):def speak(self):print("Meow meow")def animal_sound(animal):animal.speak()  # 调用传入对象的speak方法# 创建Dog和Cat的实例对象
dog = Dog()
cat = Cat()# 传递不同的对象
animal_sound(dog)  # 输出: Woof woof
animal_sound(cat)  # 输出: Meow meow

图片

多态是实现开闭原则的关键部分,即软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这使得在不更改现有代码的情况下,用户可以添加新功能,使系统易于扩展和维护。


以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

这篇关于Python14 面向对象编程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081661

相关文章

如何掌握面向对象编程的四大特性、Lambda 表达式及 I/O 流:全面指南

这里写目录标题 OOP语言的四大特性lambda输入/输出流(I/O流) OOP语言的四大特性 面向对象编程(OOP)是一种编程范式,它通过使用“对象”来组织代码。OOP 的四大特性是封装、继承、多态和抽象。这些特性帮助程序员更好地管理复杂的代码,使程序更易于理解和维护。 类-》实体的抽象类型 实体(属性,行为) -》 ADT(abstract data type) 属性-》成

Java基础回顾系列-第二天-面向对象编程

面向对象编程 Java类核心开发结构面向对象封装继承多态 抽象类abstract接口interface抽象类与接口的区别深入分析类与对象内存分析 继承extends重写(Override)与重载(Overload)重写(Override)重载(Overload)重写与重载之间的区别总结 this关键字static关键字static变量static方法static代码块 代码块String类特

Python中的私有属性与方法:解锁面向对象编程的秘密

在Python的广阔世界里,面向对象编程(OOP)是一种强大而灵活的方法论,它帮助我们更好地组织代码、管理状态,并构建可复用的软件组件。而在这个框架内,私有属性与方法则是实现封装的关键机制之一。它们不仅有助于隐藏类内部的具体实现细节,还能保护数据免受外部干扰。今天,让我们一起探索Python中私有属性与方法的魅力所在,了解它们如何在实际开发中发挥重要作用。 引言 随着软件系统变得越来越复杂,维

面向对象编程 和 面向过程编程 介绍

面向对象编程(Object-Oriented Programming,OOP)和面向过程编程(Procedural Programming,PP)是两种常见的编程范式。它们各自有不同的设计理念、代码组织方式和适用场景。以下是对这两种编程范式的详细介绍。 1. 面向对象编程(OOP) 面向对象编程是一种以对象为核心的编程范式,它将程序结构化为一组对象,这些对象具有特定的属性(数据)和行为(方法)

从二叉树看类,对象和面向对象编程

一句话 对象就是活的类 对象在函数里面活动执行任务 本身的自带属性或者行为是在类里面提前定义好的 二叉树来看: 实际上,递归函数里面的root就是类的活体,本来这个类就是一个节点的类里面有三个属性,root就是类的活体,是root赋予类生命,让root能在递归函数里面成为能够动态执行函数的节点,如果没有root,类就是死的,只是一个设计图,所以可以任意调用类里面的属性 所以二叉树递归函数里面的

《C++中的面向对象编程三大特性:封装、继承与多态》

在 C++编程的广阔世界中,面向对象编程(Object-Oriented Programming,OOP)的三大特性——封装、继承和多态,犹如三把强大的利器,帮助程序员构建出高效、可维护和可扩展的软件系统。本文将深入探讨如何在 C++中实现这三大特性,并通过具体的代码示例展示它们的强大之处。 一、封装(Encapsulation) 封装是将数据和操作数据的方法封装在一个类中,以实现信息隐藏和数

php面向对象编程之--封装

php面向对象编程的三大特征 ①、封装 ②、继承 ③、多态 抽象:我们在前面研究类时,实际上是把一类事物的共有的属性和行为提取出来,形成一个物理模型。这种研究问题的方法称为抽象。 封装:  封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 上面的操作是靠以下访问控制符号来实现,规定了自身权限,使有的人能访问,有的人不能访

12 Python面向对象编程:运算符重载

本篇是 Python 系列教程第 12 篇,更多内容敬请访问我的 Python 合集 在理解运算符重载之前我们已经知道了什么是方法重载,方法重载就是子类继承父类并且定义了一个和父类一样的方法。 知道了什么是重载,也知道了什么是运算符(加减乘除等),那么运算符重载也很好理解了,其实就是在类里面也定义一些特殊方法,使得调用这些方法能实现类对象的加减乘除。当然方法名不是随意取的,要和运算符对应

C++入门day3-面向对象编程(中)

前言:C++入门day2-面向对象编程(上)-CSDN博客 运算符重载 我们接触过函数重载,就是同名的函数有不同的功能。那么运算符重载,顾名思义也是赋予运算符其他的功能。在这里,我个人以为,运算符就是特殊函数的简写。我们先以加法切入本知识点: +加法运算符重载 如果我们想定义两数相加的函数我们该怎么办。第一时间我们就想到了这样写: int add(int a,int b){retu

11 Python面向对象编程:三大特性,封装、继承、多态

本篇是 Python 系列教程第 11 篇,更多内容敬请访问我的 Python 合集 1 封装 封装就是把类的公有属性改成私有属性,并且提供对外访问的方法。 示例 class MyClass:def __init__(self, value):self.__value = valuedef get_value(self):return self.__valuedef set_valu