如何在Python3中构造类和定义对象
介绍
Python 是一种面向对象的编程语言。 面向对象编程 (OOP) 侧重于创建可重用的代码模式,而过程编程则侧重于显式序列指令。 特别是在处理复杂的程序时,面向对象的编程让您可以重用代码并编写更具可读性的代码,从而使其更易于维护。
面向对象编程中最重要的概念之一是类和对象之间的区别,其定义如下:
- Class — 程序员为对象创建的蓝图。 这定义了一组属性,这些属性将表征从此类实例化的任何对象。
- Object — 一个类的实例。 这是类的实现版本,类在程序中体现出来。
这些用于创建模式(在类的情况下),然后使用模式(在对象的情况下)。
在本教程中,我们将介绍创建类、实例化对象、使用构造方法初始化属性以及处理同一类的多个对象。
先决条件
您应该在您的计算机或服务器上安装 Python 3 并设置编程环境。 如果您没有设置编程环境,您可以参考本地编程环境或服务器上的编程环境适合您的操作的安装和设置指南系统(Ubuntu、CentOS、Debian 等)
课程
类就像您可以定义用于创建对象的蓝图或原型。
我们使用 class 关键字定义类,类似于我们使用 def 关键字 定义函数 的方式。
Info: 要跟随本教程中的示例代码,请通过运行 python3 命令在本地系统上打开 Python 交互式 shell。 然后,您可以通过在 >>> 提示符后添加示例来复制、粘贴或编辑示例。
让我们定义一个名为 Shark 的类,它有两个与之关联的函数,一个用于游泳,一个用于令人敬畏:
鲨鱼.py
class Shark:
def swim(self):
print("The shark is swimming.")
def be_awesome(self):
print("The shark is being awesome.")
因为这些函数在类 Shark 下缩进,所以它们被称为方法。 Methods 是一种在类中定义的特殊函数。
这些函数的参数是单词 self,它是对基于此类的对象的引用。 要引用类的实例(或对象),self 将始终是第一个参数,但它不必是唯一的。
定义这个类并没有创建任何 Shark 对象,只是我们可以稍后定义的 Shark 对象的模式。 也就是说,如果您在此阶段运行上述程序,则不会返回任何内容。
创建上面的 Shark 类为我们提供了一个对象的蓝图。
对象
对象是类的一个实例。 我们可以使用上面定义的 Shark 类,并使用它来创建它的对象或实例。
我们将创建一个名为 sammy 的 Shark 对象:
sammy = Shark()
在这里,我们将对象 sammy 初始化为类的实例,方法是将其设置为 Shark()。
现在,让我们对 Shark 对象 sammy 使用这两种方法:
sammy = Shark() sammy.swim() sammy.be_awesome()
Shark 对象 sammy 使用 swim() 和 be_awesome() 两种方法。 我们使用点运算符 (.) 调用它们,它用于引用对象的属性。 在这种情况下,属性是一个方法,它用括号调用,就像你也用函数调用一样。
因为关键字 self 是 Shark 类中定义的方法的参数,所以 sammy 对象被传递给方法。 self 参数确保方法具有引用对象属性的方式。
但是,当我们调用方法时,括号内没有传递任何内容,对象 sammy 会自动通过点运算符传递。
让我们在程序的上下文中添加对象:
鲨鱼.py
class Shark:
def swim(self):
print("The shark is swimming.")
def be_awesome(self):
print("The shark is being awesome.")
def main():
sammy = Shark()
sammy.swim()
sammy.be_awesome()
if __name__ == "__main__":
main()
让我们运行程序看看它做了什么:
python shark.py
OutputThe shark is swimming. The shark is being awesome.
对象 sammy 调用程序的 main() 函数中的两个方法,使这两个方法运行。
构造方法
构造方法用于初始化数据。 一旦实例化类的对象,它就会运行。 也称为 __init__ 方法,它将是类的第一个定义,如下所示:
class Shark:
def __init__(self):
print("This is the constructor method.")
如果您将上述 __init__ 方法添加到上述程序中的 Shark 类中,则程序将输出以下内容,而无需修改 sammy 实例中的任何内容:
OutputThis is the constructor method. The shark is swimming. The shark is being awesome.
这是因为构造函数方法是自动初始化的。 您应该使用此方法来执行您希望对类对象进行的任何初始化。
让我们创建一个使用 name 变量的方法,而不是使用上面的构造方法,我们可以使用该变量为对象分配名称。 我们将 name 作为参数传递并设置 self.name 等于 name:
鲨鱼.py
class Shark:
def __init__(self, name):
self.name = name
接下来,我们可以修改函数中的字符串以引用名称,如下所示:
鲨鱼.py
class Shark:
def __init__(self, name):
self.name = name
def swim(self):
# Reference the name
print(self.name + " is swimming.")
def be_awesome(self):
# Reference the name
print(self.name + " is being awesome.")
最后,我们可以将 Shark 对象 sammy 的名称设置为等于 "Sammy",方法是将其作为 Shark 类的参数传递:
鲨鱼.py
class Shark:
def __init__(self, name):
self.name = name
def swim(self):
print(self.name + " is swimming.")
def be_awesome(self):
print(self.name + " is being awesome.")
def main():
# Set name of Shark object
sammy = Shark("Sammy")
sammy.swim()
sammy.be_awesome()
if __name__ == "__main__":
main()
我们现在可以运行程序了:
python shark.py
OutputSammy is swimming. Sammy is being awesome.
我们看到我们传递给对象的名称正在被打印出来。 我们使用参数名称(以及 self 关键字)定义了 __init__ 方法,并在方法中定义了一个变量。
因为构造函数方法是自动初始化的,所以我们不需要显式调用它,只需要在创建类的新实例时传递类名后面括号中的参数即可。
如果我们想添加另一个参数,例如 age,我们也可以将其传递给 __init__ 方法:
class Shark:
def __init__(self, name, age):
self.name = name
self.age = age
然后,当我们创建对象 sammy 时,我们可以在语句中传递 Sammy 的年龄:
sammy = Shark("Sammy", 5)
要使用 age,我们还需要在调用它的类中创建一个方法。
构造方法允许我们初始化对象的某些属性。
使用多个对象
类很有用,因为它们允许我们基于相同的蓝图创建许多相似的对象。
为了了解它是如何工作的,让我们在程序中添加另一个 Shark 对象:
鲨鱼.py
class Shark:
def __init__(self, name):
self.name = name
def swim(self):
print(self.name + " is swimming.")
def be_awesome(self):
print(self.name + " is being awesome.")
def main():
sammy = Shark("Sammy")
sammy.be_awesome()
stevie = Shark("Stevie")
stevie.swim()
if __name__ == "__main__":
main()
我们创建了第二个 Shark 对象,称为 stevie 并将名称 "Stevie" 传递给它。 在此示例中,我们将 be_awesome() 方法与 sammy 和 swim() 方法与 stevie 一起使用。
让我们运行程序:
python shark.py
OutputSammy is being awesome. Stevie is swimming.
输出显示我们正在使用两个不同的对象,即 sammy 对象和 stevie 对象,它们都是 Shark 类。
类可以按照相同的模式创建多个对象,而无需从头开始创建每个对象。
结论
本教程介绍了创建类、实例化对象、使用构造方法初始化属性以及使用同一类的多个对象。
面向对象编程是一个需要理解的重要概念,因为它支持代码重用,因为为一个程序创建的对象可以在另一个程序中使用。 面向对象的程序也有助于更好的程序设计,因为复杂的程序难以编写并且需要仔细规划,这反过来又减少了随着时间的推移维护程序的工作量。