学无先后,达者为师

网站首页 Python教程 正文

使用 Python 介绍面向对象编程 (OOP)

作者:程序员孔乙己 更新时间: 2022-01-22 Python教程

面向对象编程 (OOP)是一种编程范式,它提供了结构化程序的方法,以便将属性和行为分组到单个对象中。

例如,一个对象可以代表一个具有姓名、年龄和地址等属性的人,以及走路、说话、呼吸和跑步等行为。它可以表示具有收件人列表、主题、正文等属性以及添加和发送附件等行为的电子邮件。

换句话说,面向对象编程是一种对现实世界中的具体事物(例如汽车)以及事物之间的关系(例如公司与员工、学生与教师等)进行建模的方法。此类编程对现实世界进行建模实体作为具有某些关联数据并可以执行某些功能的软件对象。

另一种常见的编程范式是过程式编程,它像食谱一样构建程序,因为它以函数和代码块的形式提供一组步骤,这些步骤按顺序流动以完成任务。

最重要的一点是对象是面向对象编程的中心,它不仅像过程编程那样表示数据,而且在程序的一般结构中也是如此。

如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~

为什么我们应该使用面向对象编程(OOP)?

开发人员经常选择在他们的 Python 程序中使用面向对象编程 (OOP),因为它使代码更具可重用性,并且更容易处理更大的程序。这样的程序可以帮助开发人员避免重复代码,因为一个类可以定义一次并多次重用。

Python 是一种面向对象编程 (OOP)语言,它是一种非常流行的软件创建方式。与主要强调函数的过程式编程不同,面向对象的编程强调对象。

使用 OOP,您可以使您的程序更有条理、可扩展、可重用和可扩展。然而,面向对象编程(OOP)的概念对一些开发人员来说可能有点陌生。这可能很难理解,但我向你保证,毫无疑问,它是一个非常强大的概念。

让我们稍微谈谈构成面向对象编程(OOP)本质的一些元素。

我们如何用 Python 定义类?

就像 Python 中的函数定义以 def 关键字开头一样,类定义也以 class 关键字开头。

类中的第一个字符串称为 docstring 并且有关于类的简短描述。虽然不是强制性的,但是出于文档的原因,一般强烈建议放置它,但不要担心如果不放置它就不会发生任何事情,它只是以最好的方式做事。

这是一个简单的类定义,没什么花哨的,已经包含了文档字符串,所以你可以看到它是如何添加到我们的代码中的。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">NicaraguanTypicalMeals</span><span style="color:var(--syntax-text-color)">:</span>
<span style="color:var(--syntax-string-color)">''' This is the  NicaraguanTypicalMeals class '''</span>
<span style="color:var(--syntax-declaration-color)">pass</span>
</code></span></span>

一个类创建一个新的本地命名空间,其中定义了它的所有属性。属性可以是数据或函数。

它还包含以两个下划线开头的特殊属性。为了给你一个具体的例子,你可以尝试使用 __doc,它为我们提供了一些类的文档字符串。

一旦我们定义了一个类,就会创建一个具有相同名称的新类对象。这个类对象允许我们访问不同的属性,以及创建该类的新对象的实例。

一个类的示例还包含一个用于问候 Python 开发人员的方法,类似于以下代码段中建议的类:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">PythonDev</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-string-color)">''' This is the docstrings for the PythonDev class '''</span>

    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-literal-color)">18</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">nationality</span><span style="color:var(--syntax-error-color)">=</span><span style="color:var(--syntax-string-color)">"Nicaraguense"</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">age</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">age</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">nationality</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">nationality</span>

    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">greet</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Nationality: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">nationality</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Current age: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> years old."</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># First, we create the instance of this class
</span><span style="color:var(--syntax-text-color)">pythonDev01</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">PythonDev</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">39</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Let's use the methods of this object
</span><span style="color:var(--syntax-text-color)">pythonDev01</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">greet</span><span style="color:var(--syntax-text-color)">()</span>

<span style="color:var(--syntax-comment-color)"># Create another instance passing both parameters now
</span><span style="color:var(--syntax-text-color)">pythonDev02</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">PythonDev</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-literal-color)">20</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Costarricense"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">pythonDev02</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">greet</span><span style="color:var(--syntax-text-color)">()</span>

<span style="color:var(--syntax-comment-color)"># We can also access your methods individually
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Nationality: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">pythonDev01</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">nationality</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Current Age: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">pythonDev01</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

类与实例

类用于创建用户定义的数据结构。类定义称为方法的函数,这些函数标识从该类创建的对象可以使用其数据执行的行为和动作。让我们看一个类的例子:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Dog</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">breed</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">age</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">age</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">breed</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">breed</span>

<span style="color:var(--syntax-comment-color)"># Now let's instantiate by creating two objects of this class
</span><span style="color:var(--syntax-text-color)">chele</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">Dog</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Chele"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">4</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Belgian Tervuren"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-text-color)">kiki</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">Dog</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Kiki"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">2</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-string-color)">"Doberman Pinscher"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Let's see then what these Dog instances contain:
</span>
<span style="color:var(--syntax-comment-color)"># Chele is a 4 years old Belgian Tervuren.
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">chele</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> is a </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">chele</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> years old </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">chele</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">breed</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Kiki is a 2 years old Doberman Pinscher.
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">kiki</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> is a </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">kiki</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> years old </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">kiki</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">breed</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>

</code></span></span>

正如您在此示例中所看到的,类是应如何定义事物的模型。它实际上不包含任何数据。Dog 类指定定义狗需要名称、年龄和品种,但它不包含任何特定狗的名称、年龄或品种。

虽然类是蓝图,但实例是从类构造并包含实际数据的对象。Dog 类的实例不再是蓝图。他是一只真正的狗,有一个名字,就像 Chele,四岁,是比利时 Tervuren 品种。

换句话说,课程就像一个表格或测验。实例就像一个填满信息的表格。就像许多人可以用自己独特的信息完成相同的表格一样,可以从一个类创建许多实例,你明白我的意思吗,小鹿斑比?

Python 中的对象是什么?

在 Python 中,开发人员可以定义对象。对象是方法和变量的集合,它们存在于计算机内存的某个位置。这些对象可以在运行时进行操作。

在 OOP 中,对象是类的实例。正如我之前所说,类就像一个计划,而实例是具有真实值的类的副本。对象由以下元素组成:

  • 状态:由对象的属性表示。它还反映了对象的属性。
  • 行为:它由对象的方法表示。它还反映了一个对象对其他对象的响应。
  • 身份:给一个对象一个唯一的名字,并允许一个对象与其他对象交互。

声明对象(也称为实例化类)

当一个类的对象被创建时,该类的一个实例就被称为创建了。所有实例共享类的属性和行为。但是这些属性的值,即状态,对于每个对象都是唯一的。一个类可以有任意数量的实例。

为了向您展示这一点,让我们创建一个有点不同寻常的理论示例,将流行的尼加拉瓜食物作为此类的属性值。然后我们将定义一个NicaraguanTypicalMeals类的对象。

要创建一个对象,让我们声明继承此实例特征的类。然后我们将通过将它们中的每一个打印到屏幕上来访问这些继承的属性。

在 Python 中,只需几行代码就可以做到这一点:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">NicaraguanTypicalMeals</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-string-color)">''' This is the NicaraguanTypicalMeals Class '''</span>

 <span style="color:var(--syntax-comment-color)"># Declare the class attributes with their respective values
</span>    <span style="color:var(--syntax-text-color)">breakfast</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Nacatamal o Tamuga de Masatepe"</span>
    <span style="color:var(--syntax-text-color)">lunch</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Sopa de Mondongo Masatepina"</span>
    <span style="color:var(--syntax-text-color)">dinner</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"GalloPinto con Queso Frito y Tajadas Maduras"</span>

<span style="color:var(--syntax-comment-color)"># We now create the instance of this class
</span><span style="color:var(--syntax-text-color)">dish</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">NicaraguanTypicalMeals</span><span style="color:var(--syntax-text-color)">()</span>

<span style="color:var(--syntax-comment-color)"># Let's see what the created object owns as
# the primary inheritance of the class
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Breakfast: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">dish</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">breakfast</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Lunch: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">dish</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">lunch</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Dinner: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">dish</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">dinner</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

正如我们所见,类是我们刚刚构建的NicaraguanTypicalMeals对象的模型。我们可以把一个类想象成一个房子的草图(原型)。它包含有关地板、门、窗等的所有细节。根据这些描述,我们建造了房子。房子是对象。

就像许多房子可以从房子的平面图中建造出来一样,我们也可以从一个类中创建许多对象。对象也称为类的实例,创建该对象的过程称为实例化,您会在 OOP 中听到很多,所以我建议您记住这一点,亲爱的读者。

在 Python 中创建对象

我们看到类对象可以用来访问不同的属性。它还可以用于创建对象的新实例,我们也将其称为该类的实例化,我们之前提到过。创建对象的过程类似于调用函数。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-text-color)">PythonZealot01</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">PythonZealot</span><span style="color:var(--syntax-text-color)">()</span>
</code></span></span>

这将创建一个名为PythonZealot01的新对象实例。我们可以使用对象名称的前缀来访问对象的属性。

属性可以是数据或方法。对象的方法是该类的对应函数。这意味着由于 PythonZealot01.sayHello 是一个函数对象(或类属性),那么PythonZealot01.sayHello将是一个方法对象。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">PythonZealot</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-string-color)">''' This is the docstrings for the PythonZealot class '''</span>

   <span style="color:var(--syntax-comment-color)"># Declare the class attributes with their respective values
</span>    <span style="color:var(--syntax-text-color)">job_title</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Python Developer"</span>

    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">sayHello</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Hi guys: I am a </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">job_title</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">."</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># First, create an instance of this class
</span><span style="color:var(--syntax-text-color)">PythonZealot01</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">PythonZealot</span><span style="color:var(--syntax-text-color)">()</span>

<span style="color:var(--syntax-comment-color)"># Use the object methods now
</span><span style="color:var(--syntax-text-color)">PythonZealot01</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">sayHello</span><span style="color:var(--syntax-text-color)">()</span>
</code></span></span>

在类中使用属​​性、Getter 和 Setter

在 Python 中,getter 和 setter 与其他面向对象的编程语言不同。基本上,在面向对象程序中使用 getter 和 setter 的主要目的是确保数据封装。Python 中的私有变量实际上并不像其他面向对象语言中的隐藏字段。通常,Python 中的 Getter 和 Setter 常在以下情况下使用:

  • 我们需要添加验证逻辑来​​获取和设置一个值。
  • 避免直接访问类字段,即私有变量不能被外部用户直接访问或修改。但简而言之,什么是 Getter 和 Setter?让我们看看我们如何从理论上定义这些方法:

Getter:这些是面向对象编程 (OOP) 中使用的方法,有助于访问类的私有属性。

Setter:这些是面向对象编程 (OOP) 中使用的方法,可帮助设置类中私有属性的值。

对象中的私有属性和封装

现在让我们看看如何使用 python 快速实现私有类属性:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Developer</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-string-color)">''' This is the Developer Class '''</span>

    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-comment-color)"># declare attributes or properties as private
</span>        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__age</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">age</span>


    <span style="color:var(--syntax-comment-color)"># getter method to get the properties using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span>

    <span style="color:var(--syntax-comment-color)"># setter method to change the value 'name' using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">set_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>

</code></span></span>

在这个示例中,我们清楚地看到 Developer 类具有三个方法。

init _ : - 用于初始化类的属性或属性。

__name:这是一个私有属性。

get_name:用于获取私有属性名称的值。

set_name:用于使用类的对象设置name的值。

您不能直接在 Python 中访问私有变量。这就是您实现 getter 方法的原因。

仍然对类的功能感到困惑?让我简要地向您解释一下,如果您不了解所有内容,请不要担心,因为它需要一些时间来细细品味,但这是值得的,亲爱的读者。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Developer</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-string-color)">''' This is the Developer Class '''</span>
    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-comment-color)"># declare attributes or properties as private
</span>        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>

    <span style="color:var(--syntax-comment-color)"># getter method to get the properties using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span>

    <span style="color:var(--syntax-comment-color)"># setter method to change the value 'name' using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">set_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>

<span style="color:var(--syntax-comment-color)"># --------------- Implementation -------------------
</span>
<span style="color:var(--syntax-comment-color)"># Creating an object based on the WebDeveloper class
</span><span style="color:var(--syntax-text-color)">objWebDev</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">WebDeveloper</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Alvison Hunter"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Get the value of 'name' using the get_name() method
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Name: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">objWebDev</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_name</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Set a new value for 'name' attribute using set_name() method
</span><span style="color:var(--syntax-text-color)">objWebDev</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">set_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Alvison Lucas Hunter Arnuero"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Let's see the results now
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Name: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">objWebDev</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_name</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

</code></span></span>

这就是在 Python 中实现私有属性、getter 和 setter 的方式。让我们以Pythonic 的方式编写相同的实现。

Pythonic 方式中,不需要 getter 或 setter 方法来访问或更改属性。您可以使用属性名称直接访问它。

您是在告诉我 Pythonic 方式甚至更容易,而无需使用 getter 和 setter?嗯……不完全是,我亲爱的同事。让我们用下面的例子来解释这个问题。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">PythonicWay</span><span style="color:var(--syntax-text-color)">:</span>
<span style="color:var(--syntax-string-color)">''' This is the PythonicWay class '''</span>

    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">url</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">url</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">url</span>

<span style="color:var(--syntax-comment-color)"># Create an object or instance for the PythonicWay class
</span><span style="color:var(--syntax-text-color)">obj2</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">PythonicWay</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"https://alvisonhunter.com/"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Let's see the results now, fellows
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Developer Website: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">obj2</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">url</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

</code></span></span>

上面提到的两个类有什么区别?

开发人员隐藏私有属性和方法。它实现了面向对象编程(OOP)典型的封装功能。

相比之下,PythonicWay类不隐藏数据。它不实现任何面向对象编程 (OOP) 封装功能。

对于任何现代开发人员,在这种情况下最推荐使用的方法是什么?

老实说,这完全取决于我们在解决问题时的需要。如果你想要私有属性和方法,你可以使用它们的 setter 和 getter 方法来实现这个类,否则你可以用 Pythonic 的方式来实现它。

我们什么时候讨论@property 装饰器?

我们现在就做:如果你想有一些条件来设置 Developer 类中属性的值怎么办?

假设我们为 name 属性传递的值等于字符串“Alvison Hunter”,我们可以将其设置为属性;否则,直接在该方法中设置默认值。

让我们通过更改 Developer 中的 set_name() 方法来实现这一点。让我们通过创建一个对象来检查这个类,一旦我们有了实例,我们将尝试进行这个更改。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Developer</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-string-color)">''' This is the docstring for the Developer class '''</span>

    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-comment-color)"># Declare attributes or properties as private
</span>        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__age</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">age</span>

    <span style="color:var(--syntax-comment-color)"># getter method to get the properties using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span>

    <span style="color:var(--syntax-comment-color)"># setter method to change the value 'name' using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">set_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">name</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__name</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">name</span>

   <span style="color:var(--syntax-comment-color)"># getter method to get the age property of the objec
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">get_age</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__age</span>

    <span style="color:var(--syntax-comment-color)"># Add the option to set the age property only if the
# parameter sent is a positive number and not a string
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">set_age</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-text-color)">):</span>

        <span style="color:var(--syntax-comment-color)"># Expected condition to see if the parameter is a valid integer
</span>        <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-error-color)">not</span> <span style="color:var(--syntax-text-color)">isinstance</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">age</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">int</span><span style="color:var(--syntax-text-color)">):</span>
            <span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"You entered an invalid age. Setting value to default."</span><span style="color:var(--syntax-text-color)">)</span>
            <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__age</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-literal-color)">18</span>
        <span style="color:var(--syntax-declaration-color)">else</span><span style="color:var(--syntax-text-color)">:</span>
            <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__age</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">age</span>

<span style="color:var(--syntax-comment-color)"># --------------- Implementation -------------------
# Create an object based on the Developer class
</span><span style="color:var(--syntax-text-color)">obj</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">Developer</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Alvison Hunter"</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-literal-color)">40</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Get the value of 'name' using the get_name() method
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Name: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_name</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Get the value of 'age' using the get_age() method
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Age: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_age</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># set a new value for 'name' attribute using set_name()
</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">set_name</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Alvison Lucas Hunter Arnuero"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># set a new value for the 'age' attribute with the set_age() method
</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">set_age</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"35"</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># Let's see the results now for both cases
</span><span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Name: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_name</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)"> | Age: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">obj</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">get_age</span><span style="color:var(--syntax-text-color)">()</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>

</code></span></span>

一切看起来都很好,它工作正常,但是有一种更合适的方法可以做到这一点。让我们看看如何使用@property 装饰器来实现上面的类。

注意:我将在以后的文章中写关于类中的装饰器,但现在我们回顾一下属性装饰器。如果你想了解更多关于装饰器的信息,我邀请你观看这个视频,它以简单的方式解释了如何在 Python 中使用它们。

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">Property</span><span style="color:var(--syntax-text-color)">:</span>
    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-comment-color)"># Starting the attribute
</span>        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">language</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">language</span>

    <span style="color:var(--syntax-error-color)">@</span><span style="color:var(--syntax-text-color)">property</span>
    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">language</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__language</span>

    <span style="color:var(--syntax-comment-color)"># The attribute & method name must be the same as
#the one used to set the attribute value
</span>    <span style="color:var(--syntax-error-color)">@</span><span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">setter</span>
    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">language</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">title</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"Python"</span><span style="color:var(--syntax-text-color)">:</span>
            <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__language</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">title</span><span style="color:var(--syntax-text-color)">()</span>
        <span style="color:var(--syntax-declaration-color)">else</span><span style="color:var(--syntax-text-color)">:</span>
            <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__language</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Use Python, dude!"</span>

<span style="color:var(--syntax-text-color)">obj3</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">Property</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"JavaScript"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">obj3</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-text-color)">)</span>

</code></span></span>

在这个例子中,我们可以看到 @property 用于获取私有属性的值,而不使用任何 getter。值得一提的是,我们必须在返回私有变量的方法前面放置一个@property 行。

要设置私有变量的值,我们在方法前面使用@method_name.setter的形式。我们必须使用它作为我们的设置器。

@language.setter将通过检查我们在方法中提到的条件来设置语言的值。使用该属性的另一种方法如下:

<span style="color:var(--syntax-text-color)"><span style="color:var(--syntax-text-color)"><code><span style="color:var(--syntax-declaration-color)">class</span> <span style="color:var(--syntax-name-color)">PropertyAlternative</span><span style="color:var(--syntax-text-color)">:</span>


    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__init__</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">new_lang</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-comment-color)"># call set_lang() to set the value 'lang'
</span>        <span style="color:var(--syntax-comment-color)"># checking certain conditions first
</span>        <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__set_lang</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">new_lang</span><span style="color:var(--syntax-text-color)">)</span>

    <span style="color:var(--syntax-comment-color)"># getter method to get the properties using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__get_lang</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">):</span>
        <span style="color:var(--syntax-declaration-color)">return</span> <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__lang</span>

    <span style="color:var(--syntax-comment-color)"># setter method to change the 'lang' value using an object
</span>    <span style="color:var(--syntax-declaration-color)">def</span> <span style="color:var(--syntax-name-color)">__set_lang</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">new_lang</span><span style="color:var(--syntax-text-color)">):</span>

        <span style="color:var(--syntax-comment-color)"># condition to check if new_lang is appropriate or not
</span>        <span style="color:var(--syntax-declaration-color)">if</span> <span style="color:var(--syntax-text-color)">new_lang</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">title</span><span style="color:var(--syntax-text-color)">()</span> <span style="color:var(--syntax-error-color)">==</span> <span style="color:var(--syntax-string-color)">"Python"</span><span style="color:var(--syntax-text-color)">:</span>
            <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__lang</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">new_lang</span>
        <span style="color:var(--syntax-declaration-color)">else</span><span style="color:var(--syntax-text-color)">:</span>
            <span style="color:var(--syntax-text-color)">self</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">__lang</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-string-color)">"Get Pythonized, young lad!"</span>


    <span style="color:var(--syntax-comment-color)">#Pass the getter & setter methods to property() method
</span>    <span style="color:var(--syntax-comment-color)"># Let's assign the result to a variable as class attribute
</span>    <span style="color:var(--syntax-text-color)">language</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">property</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-text-color)">__get_lang</span><span style="color:var(--syntax-text-color)">,</span> <span style="color:var(--syntax-text-color)">__set_lang</span><span style="color:var(--syntax-text-color)">)</span>

<span style="color:var(--syntax-comment-color)"># create a new object of the PropertyAlternative class
</span><span style="color:var(--syntax-text-color)">obj4</span> <span style="color:var(--syntax-error-color)">=</span> <span style="color:var(--syntax-text-color)">PropertyAlternative</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">"Java"</span><span style="color:var(--syntax-text-color)">)</span>
<span style="color:var(--syntax-declaration-color)">print</span><span style="color:var(--syntax-text-color)">(</span><span style="color:var(--syntax-string-color)">f</span><span style="color:var(--syntax-string-color)">"Lenguaje: </span><span style="color:var(--syntax-string-color)">{</span><span style="color:var(--syntax-text-color)">obj4</span><span style="color:var(--syntax-text-color)">.</span><span style="color:var(--syntax-text-color)">language</span><span style="color:var(--syntax-string-color)">}</span><span style="color:var(--syntax-string-color)">"</span><span style="color:var(--syntax-text-color)">)</span>
</code></span></span>

在这个例子中,我们看到所有的 getter 和 setter 方法都被传递给 property 方法,然后将结果分配给一个必须用作类属性的变量,在这种情况下我们称之为语言。

应该注意的是,setter 和 getter 方法必须是私有的才能隐藏它们,如示例中所示。

概括

好吧,我想我们已经设法介绍了一些有关面向对象编程的知识,并且我们还设法以一种基本的方式在 Python 中实现了封装,同时我们以一种简单的方式捕捉到了 setter 和 getter 的使用之间的区别以及我们创建类时的属性装饰器。

值得一提的是,大多数现代编程语言,如 Java、C# 和 C++ 等,都遵循面向对象编程 (OOP)的原则,所以这里所说的也将在一定程度上适用对他们中的一些人来说,无论您目前的职业方向或您喜欢的编程语言是什么。

如果对Python有兴趣,想了解更多的Python以及AIoT知识,解决测试问题,以及入门指导,帮你解决学习Python中遇到的困惑,我们这里有技术高手。如果你正在找工作或者刚刚学校出来,又或者已经工作但是经常觉得难点很多,觉得自己Python方面学的不够精想要继续学习的,想转行怕学不会的, 都可以加入我们,可领取最新Python大厂面试资料和Python爬虫、人工智能、学习资料!微信公众号【Python大本营】等你来玩奥~

原文链接:https://blog.csdn.net/pythonandaiot/article/details/122481427

栏目分类
最近更新