Skip to content

Python 面向对象编程 (OOP)

面向对象编程(Object-Oriented Programming, OOP)是一种强大的编程范式,它使用“对象”来设计软件。对象将数据(属性)和操作数据的函数(方法)捆绑在一起。Python 从一开始就是一门面向对象的语言。

类 (Class) 和对象 (Object)

  • 类 (Class): 是创建对象的蓝图或模板。它定义了对象将拥有的属性和方法。
  • 对象 (Object): 是类的实例。你可以根据一个类创建出许多个对象,每个对象都拥有类定义的属性和方法,但可以有自己独立的数据。

把类想象成一个“汽车”的设计图,而对象就是根据这张图纸制造出来的每一辆具体的汽车(如你的车、我的车)。

定义一个类

使用 class 关键字来定义一个类。

python
class Dog:
    """一个表示小狗的简单类。"""

    # __init__ 方法是一个特殊的方法,用于初始化对象
    # 当你创建一个新的 Dog 实例时,Python 会自动调用它
    def __init__(self, name, age):
        """初始化 name 和 age 属性。"""
        self.name = name  # 属性
        self.age = age    # 属性

    # 方法
    def sit(self):
        """模拟小狗坐下。"""
        print(f"{self.name} is now sitting.")

    def roll_over(self):
        """模拟小狗打滚。"""
        print(f"{self.name} rolled over!")

self 参数

你可能注意到了所有方法中的第一个参数 self。它是一个指向实例本身的引用,让实例能够访问其自身的属性和方法。在调用方法时,你不需要self 传递参数,Python 会自动完成。

创建和使用对象

创建类的实例(即实例化)就像调用函数一样。

python
# 根据 Dog 类创建一个名为 my_dog 的实例
my_dog = Dog("Willie", 6)

# 访问属性
print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")

# 调用方法
my_dog.sit()
my_dog.roll_over()

继承 (Inheritance)

继承是 OOP 的一个核心概念,它允许我们创建一个新类(子类),这个新类会继承一个已存在的类(父类)的所有属性和方法。子类可以重写父类的方法,也可以添加自己的新方法。

这实现了代码的重用。

python
# 创建一个父类
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("Some generic animal sound")

# 创建一个子类 Cat,它继承自 Animal
class Cat(Animal):
    def __init__(self, name, color):
        # super() 函数用于调用父类的方法
        super().__init__(name) # 调用父类的 __init__ 方法
        self.color = color

    # 重写父类的 speak 方法
    def speak(self):
        print("Meow!")

    # 添加自己的新方法
    def purr(self):
        print(f"{self.name} is purring.")

# 创建实例
my_cat = Cat("Mitty", "white")
my_cat.speak() # 调用的是 Cat 类中重写的方法 -> Meow!
my_cat.purr()  # 调用 Cat 类自己的方法 -> Mitty is purring.

封装 (Encapsulation)

封装是指将数据(属性)和操作数据的代码(方法)捆绑在一个单元(类)中。在 Python 中,我们通常通过命名约定来表示属性的可见性:

  • name: 公有属性,可以在类的外部自由访问。
  • _name: “受保护”的属性,按照约定,它只应该在类及其子类内部使用。
  • __name: “私有”属性,Python 会对其进行名称改写(name mangling),使得在外部很难直接访问,从而实现更强的封装。

封装有助于隐藏对象的内部状态,只暴露必要的接口,从而提高代码的安全性和可维护性。

本站内容仅供学习和研究使用。