天天看点

四-1、面向对象编程

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,将数据和操作数据的方法组合成一个对象,并通过封装、继承和多态等机制来进行抽象和模块化。Python是一门支持面向对象编程的语言,其提供了类(Class)和对象(Object)等基本元素,可以用于创建各种复杂的数据结构和程序。

下面是Python面向对象编程的基本概念和示例:

类的定义

在Python中,类通过class关键字进行定义。类定义中通常包含属性(Attribute)和方法(Method)两部分。

# 定义一个Person类
class Person:
    # 定义属性
    name = ""
    age = 0
    
    # 定义方法
    def say_hello(self):
        print("Hello, my name is", self.name)
           

在上面的例子中,我们定义了一个Person类,其中包含了name和age两个属性和say_hello方法。属性通常用于存储数据,方法则用于执行某些操作。

在Python中,我们可以使用class关键字来定义一个类,然后在类中定义属性和方法。下面是一个简单的例子,演示了如何定义一个类:

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
    def bark(self):
        print("汪汪!")
        
    def introduce(self):
        print(f"我是一只名叫{self.name}的小狗,今年{self.age}岁了。")
           

这里我们定义了一个叫做Dog的类,这个类有两个属性,name和age,还有两个方法,bark和introduce。其中__init__方法是一个特殊的方法,用于在创建对象时初始化属性值。另外两个方法可以在任何时候调用。

下面我们可以使用这个类创建一只叫做小黑的狗:

my_dog = Dog("小黑", 3)
           

这样我们就创建了一个名为my_dog的对象,它的名字是小黑,年龄是3岁。我们可以使用这个对象来调用类的方法:

my_dog.bark()      # 输出“汪汪!”
my_dog.introduce() # 输出“我是一只名叫小黑的小狗,今年3岁了。”
           

类的定义可以有很多变化,比如可以定义继承,可以定义静态方法等等。但是核心的思想都是一样的:定义一个数据类型,并在其中封装数据和方法,用于实现特定的功能。

对象的创建和使用

在Python中,可以通过类来创建对象,并访问对象的属性和方法。

# 创建一个Person对象
person = Person()

# 设置对象的属性
person.name = "Tom"
person.age = 18

# 调用对象的方法
person.say_hello()
           

在上面的例子中,我们创建了一个Person对象,并通过对象的属性和方法来操作对象。具体来说,我们设置了对象的name和age属性,并调用了对象的say_hello方法来打印出一个问候语。

以下是一些创建和使用对象的例子:

  1. 创建一个汽车对象,设置它的属性(颜色、品牌、价格)并调用它的方法(加速、刹车、鸣笛):
class Car:
    def __init__(self, color, brand, price):
        self.color = color
        self.brand = brand
        self.price = price
        self.speed = 0
        
    def accelerate(self):
        self.speed += 10
        print(f"The {self.color} {self.brand} car accelerates to {self.speed} km/h.")
        
    def brake(self):
        self.speed -= 10
        print(f"The {self.color} {self.brand} car slows down to {self.speed} km/h.")
        
    def horn(self):
        print("Beep! Beep!")
        
my_car = Car("red", "Toyota", 20000)
my_car.accelerate()  # 输出:The red Toyota car accelerates to 10 km/h.
my_car.brake()       # 输出:The red Toyota car slows down to 0 km/h.
my_car.horn()        # 输出:Beep! Beep!
           
  1. 创建一个人员对象,设置它的属性(姓名、性别、年龄)并调用它的方法(打招呼、介绍自己):
class Person:
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age
        
    def greet(self):
        print(f"Hi, my name is {self.name}!")
        
    def introduce(self):
        print(f"I am a {self.gender}, and I am {self.age} years old.")
        
myself = Person("Alice", "female", 25)
myself.greet()       # 输出:Hi, my name is Alice!
myself.introduce()   # 输出:I am a female, and I am 25 years old.
           
  1. 创建一个圆形对象,设置它的属性(半径)并调用它的方法(计算面积、周长):
import math

class Circle:
    def __init__(self, radius):
        self.radius = radius
        
    def area(self):
        return math.pi * self.radius ** 2
        
    def perimeter(self):
        return 2 * math.pi * self.radius
        
my_circle = Circle(5)
print(f"The area of the circle is {my_circle.area()}.")         # 输出:The area of the circle is 78.53981633974483.
print(f"The perimeter of the circle is {my_circle.perimeter()}.") # 输出:The perimeter of the circle is 31.41592653589793.
           

继承和多态

在Python中,可以使用继承来扩展已有的类,并使用多态来实现不同类之间的统一调用接口。

# 定义一个Student类,继承自Person类
class Student(Person):
    # 重写say_hello方法
    def say_hello(self):
        print("Hello, my name is", self.name, ", and I'm a student.")

# 创建一个Student对象
student = Student()

# 设置对象的属性
student.name = "Lucy"
student.age = 20

# 调用对象的方法
student.say_hello()
           

在上面的例子中,我们定义了一个Student类,继承自Person类,并重写了say_hello方法。然后,我们创建了一个Student对象,并使用该对象的属性和方法来操作对象。具体来说,我们设置了对象的name和age属性,并调用了对象的say_hello方法来打印出一个问候语。由于Student类重写了say_hello方法,因此输出的问候语与Person类的不同。

以下是一些示例:

  1. 继承
class Animal:
    def __init__(self, name):
        self.name = name
    
    def make_sound(self):
        print("The animal makes a sound.")

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)
    
    def make_sound(self):
        print("The dog barks.")

class Cat(Animal):
    def __init__(self, name):
        super().__init__(name)
    
    def make_sound(self):
        print("The cat meows.")

dog = Dog("Buddy")
cat = Cat("Fluffy")
dog.make_sound()  # 输出 "The dog barks."
cat.make_sound()  # 输出 "The cat meows."
           

在这个示例中,我们定义了一个 Animal 类,它有一个 make_sound 方法,但它并没有实现具体的行为。然后,我们定义了 Dog 类和 Cat 类,它们都继承了 Animal 类,并分别实现了自己的 make_sound 方法。这样,我们就可以用这些类来创建具体的对象,如 dog 和 cat。

  1. 多态
class Shape:
    def area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    
    def area(self):
        return 3.14 * self.radius ** 2

class Square(Shape):
    def __init__(self, length):
        self.length = length
    
    def area(self):
        return self.length ** 2

shapes = [Circle(5), Square(4), Circle(3)]

for shape in shapes:
    print(shape.area())
           

在这个示例中,我们定义了一个 Shape 类和两个子类 Circle 和 Square。它们都实现了自己的 area 方法,但是由于它们都是 Shape 类的子类,因此可以被视为同一类型。我们将这些对象放在一个列表中,并遍历这个列表,依次调用它们的 area 方法。这样,我们就可以根据需要动态地切换不同的对象,而不需要修改代码。这就是多态的好处。

总的来说,Python面向对象编程的基本元素包括类、对象、属性和方法等,可以用于创建复杂的数据结构和程序。在实际应用中,面向对象编程通常被用于封装和复用代码,提高程序的可维护性和可扩展性。