在本讲座中,我们将学习 Python 中的类、构造函数和继承。
这些概念在需要定义不同类型的大型程序中非常重要。
类
类在编程中是必不可少的,它们并不特定于 python。 很多别的 编程语言 支持类的概念。 我们使用类来定义新的数据类型。
到目前为止,我们已经了解了 Python 中的基本数据类型,例如数字、字符串和布尔值。 这些是 Python 中的基本或简单数据类型。 我们还看到了一些复杂的数据类型,例如列表和字典。
虽然这些类型非常有用,但它们并不总是用于对复杂概念进行建模。 例如,考虑一个点或购物车的想法。 购物车不是布尔值或列表。 这是一种不同类型的数据。 所以我们可以使用类来定义新的类型来模拟真实的概念。
现在,让我们定义一个名为 point 的新数据类型。 这种新类型将具有我们之前检查过的方法。
您将这样做:
我们首先使用“class”关键字定义一个类,然后给我们的类命名。
class Point
现在,看看我在这里使用的命名约定。 我在这里将第一个字母大写,这就是我们所说的帕斯卡命名约定。 这种约定不同于我们用来命名变量和函数的约定,我们总是使用小写字母并使用下划线分隔多个单词。 但是在命名类时,我们不使用下划线来分隔多个单词,而是将每个单词的第一个字母大写。
在定义了我们的类之后,使用了一个冒号,这意味着现在定义了一个块。
class Point:
def move (self):
在这个块中,我们可以定义所有属于点的函数或方法。 例如,我们可以定义一个名为“move”的函数来移动一个点。 请注意,只要我们键入左括号,PyCharm 就会自动在此处添加“self”。 这是一个特殊的关键字,让我稍后再谈。 让我们在终端上打印“move”。
print("move")
让我们定义另一种方法,如“draw”并在终端上打印它。
def draw(self):
print("draw")
我们已经完成了“point”类的定义。 使用这种新类型,我们可以创建新对象。 一个类只是定义了用于创建对象的蓝图或模板,这些对象是基于该蓝图的实际实例。 要创建一个对象,我们输入类的名称,然后像调用函数一样调用它。 这将创建一个新对象,然后将其返回。 然后我们可以将该对象存储在一个变量中。 我来给你展示:
这里我们定义了一个“point1”,它是一个三维点。 你可以看到,我们可以在终端上打印单独的坐标。
对于这一点,我们可以使用“绘制”和“移动”两种方法。
回顾一下,我们使用类来定义新类型,这些类型可以具有我们在类主体中定义的方法。 类可以具有我们可以在程序的任何位置设置的属性。
构造函数
到目前为止,我们已经学习了如何使用类创建新类型。 现在这个实现有一个小问题。 我们可以使用类创建一个没有 x 或 y 坐标的点对象,但这并不理想。 我来给你展示。
让我们在设置 x 坐标之前创建一个点并打印它。 运行我们的程序会导致如下属性错误:
这意味着点对象没有称为 x 的属性。 现在的问题是,可能有一个没有 x 或 y 坐标的点对象。 这没有任何意义,因为每当我们谈论一个点时,我们都需要知道该点的位置。 为了解决这个问题,我们使用了构造函数。 构造函数是在创建对象时调用的函数。
下面是我们如何使用构造函数。 首先,让我们在上述程序中传递 x 和 y 坐标值。
point = Point(10, 20)
print(point.x)
现在,我们需要在这个类中添加一个特殊的方法,称为构造函数。 它的语法是这样的:
def __init__(self, x, y):
init
是 initialized 的缩写,这是创建新点对象时调用的函数或方法。 x 和 y 紧随其后 self
添加两个额外的参数。
之后,我们应该将 x 和 y 映射到传递的值,即 10 和 20
self.x = x
self.y = y
我们使用 self
引用当前对象,然后我们将 x 属性设置为传递给函数“x”的 x 参数。 这样,使用 init
方法,我们可以初始化我们的对象。 此方法称为构造函数。 让我们运行我们的程序。
现在,我们可以稍后更改 x 和 y 坐标。 让我们更新 x 坐标:
point = Point(10, 20)
point.x = 11
print(point.x)
现在,x 坐标更新为值 11。
锻炼
这是一个有趣的练习。
我想让你定义一个新的类型,叫做人。 这些“Person”对象应该有一个“name
” 属性以及“talk()
“ 方法。
这是一项简单的任务,不应超过几分钟。
解决方案
从定义类“Person”开始,如下所示:
class Person:
self.name = name
我们稍后会定义构造函数。 现在,我们可以创建“Person”对象。 我们就叫它约翰吧
john = Person("John Smith")
print(john.name)
john.talk()
现在,继续代码的第一部分并创建一个构造函数。
def __init__(self, name):
最终代码将如下所示:
您还可以将格式化字符串和其他概念与类和构造函数结合使用。
遗产
继承是与类相关的另一个概念,它可以让您重用代码。
考虑这段代码。
class Dog:
def walk(self):
print("walk")
我们创建了一个带有“walk”方法的“Dog”类。 在这种方法中,我们只是在终端上打印 walk 消息。 比方说,在一个真实的程序中,这里有 10 行代码,而不是只有一行。 将来,如果需要另一个类来拥有“walk”方法,我们将不得不重复所有这些代码。 这并不理想。
在编程中,我们有一个叫做 DRY 的原则,即不要重复自己。 假设将来某个时候,我们发现我们的“walk”方法存在问题,如果我们在许多其他地方重复或复制了这个方法,我们将不得不回来并在我们复制的每个地方解决这个问题代码。 所以这就是为什么在编程中我们不应该定义两次。
有不同的方法可以解决这个问题,但在这里我们将学习一种对初学者来说更容易的方法,它称为继承。 在这种情况下,我们将创建另一个类“mammal”并在该类中定义我们的“walk”属性。
class Mammal:
def walk(self):
print("walk")
在定义我们的“哺乳动物”类之后,我们可以使用继承来传递如下属性:
dog 和 cat 类都继承了它们父类中定义的所有类方法。 现在,我们可以像这样添加特定于狗的方法:
class Dog:
def bark(self):
print("bark")
包起来!
这完全是关于类、构造函数和在具有继承概念的类中重用代码。 现在我们即将结束我们的系列。 至此,您应该能够在 Python 中生成良好、可读和简洁的代码。
我们将在下一讲中看到模块和包的概念。
发表评论