# Python 面向对象编程 > 原文: [https://www.programiz.com/python-programming/object-oriented-programming](https://www.programiz.com/python-programming/object-oriented-programming) #### 在本教程中,您将借助示例来学习 Python 中的面向对象编程(OOP)及其基本概念。 ## 面向对象编程 Python 是一种多范式编程语言。 它支持不同的编程方法。 解决编程问题的一种流行方法是创建对象。 这就是所谓的面向对象编程(OOP)。 对象具有两个特征: * 属性 * 行为 让我们举个例子: 鹦鹉可以是一个对象,因为它具有以下属性: * 名称,年龄,颜色作为属性 * 唱歌,跳舞作为行为 Python 中的 OOP 概念专注于创建可重用的代码。 此概念也称为 DRY(不要重复自己)。 在 Python 中,OOP 的概念遵循一些基本原则: * * * ## 类 类是对象的蓝图。 我们可以将类看作是带有标签的鹦鹉的素描。 它包含有关名称,颜色,大小等的所有详细信息。基于这些描述,我们可以研究鹦鹉。 在这里,鹦鹉是一个对象。 鹦鹉类的示例可以是: ```py class Parrot: pass ``` 在这里,我们使用`class`关键字定义一个空类`Parrot`。 从类中,我们构造实例。 实例是从特定类创建的特定对象。 * * * ## 对象 对象(实例)是类的实例。 定义类时,仅定义对象的描述。 因此,没有分配内存或存储。 鹦鹉类对象的示例可以是: ```py obj = Parrot() ``` 在此,`obj`是类别`Parrot`的对象。 假设我们有鹦鹉的详细信息。 现在,我们将展示如何构建鹦鹉的类和对象。 ### 示例 1:在 Python 中创建类和对象 ```py class Parrot: # class attribute species = "bird" # instance attribute def __init__(self, name, age): self.name = name self.age = age # instantiate the Parrot class blu = Parrot("Blu", 10) woo = Parrot("Woo", 15) # access the class attributes print("Blu is a {}".format(blu.__class__.species)) print("Woo is also a {}".format(woo.__class__.species)) # access the instance attributes print("{} is {} years old".format( blu.name, blu.age)) print("{} is {} years old".format( woo.name, woo.age)) ``` **输出** ```py Blu is a bird Woo is also a bird Blu is 10 years old Woo is 15 years old ``` 在上面的程序中,我们创建了一个名为`Parrot`的类。 然后,我们定义属性。 属性是对象的特征。 这些属性在类的`__init__`方法中定义。 创建对象后,首先运行的是初始化方法。 然后,我们创建`Parrot`类的实例。 这里,`Blu`和`woo`是我们新对象(值)的引用。 我们可以使用`__class__.species`访问`class`属性。 类的所有实例的类属性都相同。 同样,我们使用`blu.name`和`blu.age`访问实例属性。 但是,类的每个实例的实例属性都不同。 要了解有关类和对象的更多信息,请转到 [Python 类和对象](/python-programming/class) * * * ## 方法 方法是在类主体内定义的函数。 它们用于定义对象的行为。 ### 示例 2:在 Python 中创建方法 ```py class Parrot: # instance attributes def __init__(self, name, age): self.name = name self.age = age # instance method def sing(self, song): return "{} sings {}".format(self.name, song) def dance(self): return "{} is now dancing".format(self.name) # instantiate the object blu = Parrot("Blu", 10) # call our instance methods print(blu.sing("'Happy'")) print(blu.dance()) ``` **输出**: ```py Blu sings 'Happy' Blu is now dancing ``` 在上面的程序中,我们定义了两种方法,即`sing()`和`dance()`。 这些称为实例方法,因为它们是在实例对象(即`blu`)上调用的。 * * * ## 继承 继承是一种创建新类以使用现有类的详细信息而不进行修改的方法。 新形成的类是派生类(或子类)。 同样,现有类是基类(或父类)。 ### 示例 3:在 Python 中使用继承 ```py # parent class class Bird: def __init__(self): print("Bird is ready") def whoisThis(self): print("Bird") def swim(self): print("Swim faster") # child class class Penguin(Bird): def __init__(self): # call super() function super().__init__() print("Penguin is ready") def whoisThis(self): print("Penguin") def run(self): print("Run faster") peggy = Penguin() peggy.whoisThis() peggy.swim() peggy.run() ``` **输出**: ```py Bird is ready Penguin is ready Penguin Swim faster Run faster ``` 在以上程序中,我们创建了两个类,即`Bird`(父类)和`Penguin`(子类)。 子类继承父类的功能。 我们可以从`swim()`方法中看到这一点。 再次,子类修改了父类的行为。 我们可以从`whoisThis()`方法中看到这一点。 此外,我们通过创建新的`run()`方法来扩展父类的功能。 另外,我们在`__init__()`方法内使用`super()`函数。 这使我们可以在子类中运行父类的`__init__()`方法。 * * * ## 封装形式 在 Python 中使用 OOP,我们可以限制对方法和变量的访问。 这样可以防止数据直接修改(称为封装)。 在 Python 中,我们使用下划线作为前缀来表示私有属性,即单`_`或双`__`。 ### 示例 4:Python 中的数据封装 ```py class Computer: def __init__(self): self.__maxprice = 900 def sell(self): print("Selling Price: {}".format(self.__maxprice)) def setMaxPrice(self, price): self.__maxprice = price c = Computer() c.sell() # change the price c.__maxprice = 1000 c.sell() # using setter function c.setMaxPrice(1000) c.sell() ``` **输出**: ```py Selling Price: 900 Selling Price: 900 Selling Price: 1000 ``` 在上面的程序中,我们定义了`Computer`类。 我们使用`__init__()`方法存储`Computer`的最高售价。 我们试图修改价格。 但是,我们无法更改它,因为 Python 将`__maxprice`视为私有属性。 如图所示,要更改该值,我们必须使用设置器函数,即`setMaxPrice()`,该函数将价格作为参数。 * * * ## 多态 多态是一种功能(在 OOP 中),可以将公共接口用于多种形式(数据类型)。 假设我们需要为形状着色,有多个形状选项(矩形,正方形,圆形)。 但是,我们可以使用相同的方法为任何形状着色。 这个概念称为多态。 ### 示例 5:在 Python 中使用多态 ```py class Parrot: def fly(self): print("Parrot can fly") def swim(self): print("Parrot can't swim") class Penguin: def fly(self): print("Penguin can't fly") def swim(self): print("Penguin can swim") # common interface def flying_test(bird): bird.fly() #instantiate objects blu = Parrot() peggy = Penguin() # passing the object flying_test(blu) flying_test(peggy) ``` **输出**: ```py Parrot can fly Penguin can't fly ``` 在上面的程序中,我们定义了两个类别`Parrot`和`Penguin`。 它们每个都有一个通用的`fly()`方法。 但是,它们的功能不同。 要使用多态,我们创建了一个通用接口,即`flying_test()`函数,该函数接受任何对象并调用该对象的`fly()`方法。 因此,当我们在`flying_test()`函数中传递`blu`和`peggy`对象时,它有效地运行了。 * * * ## 要记住的要点: * 面向对象的编程使程序易于理解并且高效。 * 由于该类是可共享的,因此可以重用该代码。 * 数据通过数据抽象是安全的。 * 多态允许相同的接口用于不同的对象,因此程序员可以编写高效的代码。