面向对象程序设计有哪些

2025-04-1506:54:46创业资讯0

面向对象编程(OOP)对于初学者来说可能是一个具有挑战性的概念。许多书籍和教程都从解释OOP的基本概念开始,讨论诸如封装、继承和多态等核心概念,但有时候解释的效果并不理想。

本文旨在以更简单、更直观的方式帮助程序员、数据科学家和Python爱好者们理解OOP的概念。我们将避免使用行话,并通过实际例子来解说。

这篇文章是关于以非专业、容易理解的方式解释OOP概念的。简单地说,在Python中,一切都是对象,类是对象的蓝图或模板。当我们写下这样的代码时:

我们正在创建一个int类型的对象a,其值为2;以及一个str类型的对象b,其值为“Hello!”(在默认情况下,使用双引号来创建字符串)。

在日常编程实践中,我们经常无意识地使用类和对象的概念。例如,在使用Scikit-learn模型时,我们实际上是在使用一个类。这里的分类器clf是一个对象,fit是在RandomForestClassifier类中定义的一个方法。

为什么我们更倾向于使用类来实现功能呢?我们当然也可以使用函数来实现同样的功能。但是与函数相比,类为我们提供了更多功能。以一个简单的例子来说,str类包含许多为对象定义的函数,只需按下tab键就可以访问这些函数。我们也可以自己编写这些函数,但是按下tab键并不能使用自己编写的函数。这就是所谓的封装。封装意味着将数据与操作该数据的方法捆绑在一起,或者限制对对象某些部分的直接访问。

这里的str类绑定了数据(“Hello!”)以及所有对数据进行操作的方法。同样,‘RandomForestClassifier’类将所有方法(如fit、predict等)捆绑在一起。使用类可以使代码更加模块化、易于维护。想象一下我们需要创建一个像Scikit-Learn这样的库,包含许多模型,每个模型都有fit和predict方法。如果不使用类,我们需要为每个模型提供大量函数,这将是一场。Scikit-Learn将每个模型定义为一个具有fit和predict方法的类。

现在我们已经了解了为什么要使用类以及它们的重要性。那么如何开始使用它们呢?创建一个类其实非常简单,以下是创建任何类的标准模板代码:

假设我们在一家拥有众多账户的银行工作。我们可以创建一个名为“Account”的类来处理任何类型的账户。以下是一个基本的账户类的示例,它为用户存储数据(如账户名和余额),并提供存款和取款的方法。请仔细阅读以下代码,它与之前的代码结构类似。

我们可以使用以下方法来创建一个名为Rahul、金额为100的账户:

通过以下方式访问此账户的数据:

你可能会问,我们是如何将属性balance和account_name分别设置为100和“Rahul”的?即使我们从未直接调用任何方法,对象是如何获得这些属性的?答案是,只要我们创建对象,它就会自动运行某些函数。当我们创建myAccount时,它会自动执行初始化函数。

现在让我们试着往我们的账户里存一些钱:

我们的余额成功增加到200英镑。你有没有注意到,函数deposit需要两个参数:self和amount,但我们只提供了一个参数,它仍然有效。那么self代表什么呢?当我们调用属于同一Account类的另一个函数deposit时,并向其提供myAccount对象和amount时,就会明白。此时函数需要两个参数。当我们调用同一个函数时,只有当self和myAccount是完全相同的对象时,才会发生这种情况。Python会自动为函数调用提供与参数self相同的对象myAccount。这就是为什么在函数定义中self.balance实际上是指myAccount.balance的原因。

我们知道如何创建类了,但还有一个重要的概念我们需要了解——继承。假设你正在与苹果公司的iPhone部门合作,并且需要为每种iPhone型号创建一个不同的类。在这个例子中,假设我们的第一个iPhone版本只能打电话并存储数据。我们可以这样写代码:

现在苹果计划推出一个新的iPhone型号——iPhone1,这款新机型引入了拍照功能。一种方式是复制粘贴上述代码并为新的机型创建一个新的类(比如iPhone1),但如你所见这样会引发大量的重复代码(上面已用粗体标出)。Python提供了消除这种重复代码的解决方案——通过继承来创建一个好的iPhone1类。简单地说,iPhone1现在可以访问由iPhone类定义的所有变量和方法。这样我们就无需再次定义一些通用的函数或属性了。

  • 版权说明:
  • 本文内容由互联网用户自发贡献,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 295052769@qq.com 举报,一经查实,本站将立刻删除。