《Python课程8

  

  面向对象编程(Object-oriented programming, OOP)是一种编程范式,它使用“对象”来表示现实世界中的事物及其属性(数据)和行为(方法)。面向对象编程的主要特点有:类与对象、继承、封装和多态。

  1、类(Class)是具有相同属性和方法的对象的抽象描述。对象(Object)是类的实例,具有类定义的属性和方法。在面向对象编程中,类是用于创建对象的模板,而对象则是类的具体实例。类描述了一组具有相同属性和方法的对象,它定义了这些对象如何创建以及如何表示它们的状态和行为。

  1.1 在Python中,可以使用class关键字定义类,类名通常采用驼峰命名法。例如,定义一个名为Person的类:

  

  __init__方法是类的构造方法,当创建一个新的对象时,它会被自动调用。self参数表示对象本身,它是类中方法的第一个参数。在类的方法中,可以通过self访问对象的属性和其他方法。

  要创建一个类的对象,可以使用类名进行实例化,并传入构造方法所需的参数。例如:

  

  1.2 我将通过一个例子逐行解释self的使用。

  

  这是一个简单的Dog类,包含两个属性(name和age)和两个方法(bark和display_age)。下面逐行解释代码:

  class Dog: 定义一个名为Dog的类。

  def __init__(self, name, age): 定义类的构造方法,当创建一个Dog类的实例时,这个方法会被自动调用。self是第一个参数,代表实例对象本身。name和age是传入的参数,用于初始化实例的属性。

  self.name = name 将传入的name参数赋值给实例对象的name属性。这里的self.name表示实例对象的name属性。

  self.age = age 将传入的age参数赋值给实例对象的age属性。这里的self.age表示实例对象的age属性。

  def bark(self): 定义一个名为bark的方法,它接受一个参数self,表示实例对象本身。

  print(f"{self.name} is barking!") 输出实例对象的name属性,表示这个狗在叫。这里的self.name表示实例对象的name属性。

  def display_age(self): 定义一个名为display_age的方法,它接受一个参数self,表示实例对象本身。

  print(f"{self.name} is {self.age} years old.") 输出实例对象的name和age属性,表示这个狗的名字和年龄。这里的self.name和self.age分别表示实例对象的name和age属性。

  接下来,我们创建一个Dog类的实例,并调用其方法:

  

  在这个例子中,我们创建了一个Dog类的实例dog1,然后调用了其bark和display_age方法。在调用方法时,Python会自动将实例对象dog1作为self参数传递给方法,因此我们不需要显式地传入self参数。

  2、继承

  继承是面向对象编程的一个重要概念,允许一个类继承另一个类的属性和方法。子类可以继承父类的属性和方法,并根据需要进行扩展或重写。这样,子类可以利用父类的代码,避免重复编写相同功能的代码。

  2.1 在Python中,要继承一个类,只需在类定义时在圆括号中指定父类名称。下面是一个例子,ElectricCar类继承自Car类,并添加了一个battery_capacity属性:

  

  在这个例子中,ElectricCar类继承了Car类的属性和方法,并添加了一个新的属性battery_capacity和一个新的方法charge。我们使用super()函数调用父类的构造方法,以便正确地初始化父类的属性。

  3、封装

  封装(Encapsulation)是面向对象编程(OOP)的一个重要原则,它指的是将数据(属性)和操作数据的方法(函数)组织在一个单独的对象(类)中,从而限制对对象内部属性的直接访问,提高代码的可维护性和安全性。

  3.1 封装有以下几个优点:

  隐藏实现细节:封装允许我们隐藏类的内部实现细节,只暴露必要的接口供外部使用。这有助于简化代码的使用,降低耦合度。

  提高安全性:通过限制对类属性的访问,可以防止外部代码意外或恶意修改内部状态,从而提高代码的安全性。

  易于修改和扩展:封装有助于将代码组织得更加模块化,当需要修改或扩展功能时,只需修改相应的类,而不会影响到其他部分的代码。

  3.2 在Python中,封装主要体现在以下两个方面:

  使用类(Class)组织代码:类是Python中实现封装的主要工具,它允许我们将相关的属性和方法组织在一个对象中,从而实现数据和行为的封装。

  访问控制:Python提供了一些简单的访问控制机制,例如通过名称约定(例如在属性名前加一个下划线_)表示属性为“私有”,或使用@property装饰器创建只读属性等。需要注意的是,Python并没有强制的访问控制机制,因此这些规则更多地依赖于开发者的自律。

  3.3 我将通过一个例子逐行解释封装的概念。

  

  这是一个简单的Student类,包含三个属性(name、age和_grades)和一个方法(average_grade)。我们逐行解释代码:

  class Student: 定义一个名为Student的类。

  def __init__(self, name, age, grades): 定义类的构造方法,当创建一个Student类的实例时,这个方法会被自动调用。self是第一个参数,代表实例对象本身。name、age和grades是传入的参数,用于初始化实例的属性。

  self.name = name 将传入的name参数赋值给实例对象的name属性。这里的self.name表示实例对象的name属性。

  self.age = age 将传入的age参数赋值给实例对象的age属性。这里的self.age表示实例对象的age属性。

  self._grades = grades 将传入的grades参数赋值给实例对象的_grades属性。这里的self._grades表示实例对象的_grades属性。注意,我们在属性名前加了一个下划线_,表示这是一个私有属性,外部代码不应该直接访问。

  def average_grade(self): 定义一个名为average_grade的方法,它接受一个参数self,表示实例对象本身。

  return sum(self._grades) / len(self._grades) 计算实例对象的成绩(_grades属性)的平均值,并返回结果。这里的self._grades表示实例对象的_grades属性。

  接下来,我们创建一个Student类的实例,并调用其方法:

  

  在这个例子中,我们创建了一个Student类的实例student1,然后调用了其average_grade方法。注意,我们没有直接访问_grades属性,而是通过average_grade方法来操作它。这就是封装的概念:将数据和操作数据的方法组织在一个对象(类)中,从而限制对对象内部属性的直接访问。

  4、多态

  多态是面向对象编程中的一种机制,允许使用一个接口表示多种类型。多态的主要目的是提高代码的可扩展性和可维护性。通过多态,可以编写出更加灵活、易于扩展的代码。

  4.1 在Python中,多态主要体现在函数参数的多样性和方法重写(Override)。例如:

  

  在上述示例中,print_info函数接受一个参数obj,它可以是Dog类或Cat类的实例。这表明print_info函数具有多态性。在Python中,多态是通过鸭子类型(Duck Typing)实现的,即只关心对象的行为(方法),而不关心对象的具体类型。这样,可以编写出更加灵活、易于扩展的代码。

  举报/反馈