介绍
Python是一种面向对象的编程语言。 面向对象编程 (OOP)专注于创建可重用的代码模式,与程序编程相反,程序编程专注于显式顺序指令。 当特别是在复杂程序上工作时,面向对象编程允许您重用代码和编写更易读的代码,这反过来使其更易于维护。
面向对象编程中最重要的概念之一是类和对象之间的区别,定义如下:
- 类 - 由程序员为对象创建的蓝图。 这定义了一组属性,这些属性将表征从该类实例化的任何对象。
- Object - 类的实例。 这是类的实现版本,其中类显示在程序中。
这些用于创建模式(在类的情况下),然后使用模式(在对象的情况下)。
在本教程中,我们将介绍创建类,实例化对象,使用构造函数方法初始化属性,以及使用同一类的多个对象。
类
类就像一个蓝图或一个原型,你可以定义它来创建对象。
我们使用class
关键字定义类,类似于我们通过使用def
关键字定义函数 。
让我们定义一个名为Shark
的类,它有两个与之相关的函数,一个用于游泳,一个用于表示真棒:
class Shark:
def swim(self):
print("The shark is swimming.")
def be_awesome(self):
print("The shark is being awesome.")
因为这些函数在Shark
类下缩进,所以它们被称为方法。 方法是在类中定义的一种特殊类型的函数。
这些函数的参数是单词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
会被自动传递给点运算符。
让我们在程序的上下文中添加对象:
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
:
class Shark:
def __init__(self, name):
self.name = name
接下来,我们可以修改函数中的字符串来引用名称,如下所示:
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
的名称作为Shark
类的参数来设置为等于"Sammy"
:
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
对象到我们的程序:
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()
我们创建了一个名为stevie
的第二个Shark
对象,并将名称"Stevie"
传递给它。 在这个例子中,我们使用带有sammy
的be_awesome()
方法和带有stevie
的swim()
方法。
让我们运行程序:
python shark.py
OutputSammy is being awesome.
Stevie is swimming.
输出显示我们使用两个不同的对象, sammy
对象和stevie
对象,都是Shark
类。
类使得可以按照相同的模式创建多个对象,而无需从头创建每个对象。
结论
本教程通过创建类,实例化对象,使用构造函数方法初始化属性,以及使用同一类的多个对象。
面向对象编程是一个重要的理解概念,因为它使代码循环更直接,因为为一个程序创建的对象可以在另一个程序中使用。 面向对象的程序还有助于更好的程序设计,因为复杂的程序很难写,需要仔细的规划,这反过来使得随着时间的推移维护程序的工作量减少。