Skip to content

Python 面向对象编程(OOP)

面向对象编程把程序里的概念组织成对象:对象持有数据(属性)并提供行为(方法)。类是创建对象的蓝图继承复用并扩展行为;多态让不同类对「同一套操作」各自实现。Python 同时支持 OOP 与其它范式(如过程式、函数式),可按场景混用。

本篇是概览;细节见各专题:

类(class)

描述一类对象共有的结构与能力,本身不是运行时里的那个「具体个体」。定义类时通常还不会为「某个具体对象」分配专属状态(实例在实例化时创建)。

语法:

python
class 类名:
    pass

示例:

python
class Animal:
    pass

对象(实例)

对象是类的实例。通过 类名(...) 调用构造逻辑(常见为 __init__)得到具体实体。

语法:

python
对象名 = 类名(参数列表)

示例:

python
class Dog:
    species = "狗"  # 类属性

    def __init__(self, name, age):
        self.name = name
        self.age = age


a = Dog("Blu", 10)
b = Dog("Woo", 15)

print(f"A 是 {a.__class__.species}")
print(f"B 也是 {a.__class__.species}")
print(f"{a.name} 今年 {a.age} 岁")
print(f"{b.name} 今年 {b.age} 岁")

输出:

text
A 是狗
B 也是狗
Blu 今年 10 岁
Woo 今年 15 岁

抽象(abstraction)

抽象强调对外暴露必要接口、隐藏内部实现细节。在 Python 中常通过清晰的公开方法模块/包划分抽象基类(abc约定(协议) 体现,而不是单一语法糖。

封装(encapsulation)

封装数据操作数据的方法绑在同一抽象边界内(典型即)。Python 不强制私有成员,惯例用单下划线 _x双下划线 __x(名称改写) 表达「不建议外部直接使用」,见 类与对象 与相关进阶资料。

继承(inheritance)

子类可以继承父类的属性与方法,并新增或重写行为,以提高复用性。详见 类的继承

示例:

python
class Dog:
    species = "哺乳动物"

    def __init__(self, name, age):
        self.name = name
        self.age = age

    def description(self):
        return f"{self.name} 今年 {self.age} 岁"

    def speak(self, sound):
        return f"{self.name} 说:{sound}"


class Bulldog(Dog):
    def run(self, speed):
        return f"{self.name}{speed} 奔跑"


jim = Bulldog("Jim", 12)
print(jim.description())
print(jim.run("慢速"))

输出:

text
Jim 今年 12 岁
Jim 以 慢速 奔跑

多态(polymorphism)

多态同一操作(如同名方法、同一函数接口)作用于不同类型的对象时,表现出各自实现。Python 中常见鸭子类型:不强制继承同一父类,只要对象有对应方法即可。

更系统的说明见 多态

示例:

python
class Rectangle:
    def draw(self):
        print("绘制矩形")


class Triangle:
    def draw(self):
        print("绘制三角形")


def draw_shape(shape):
    shape.draw()


a = Rectangle()
b = Triangle()

draw_shape(a)
draw_shape(b)

输出:

text
绘制矩形
绘制三角形

小结

概念要点
类 / 对象类是模板,对象是实例
封装数据与方法绑在一起,控制可见性靠约定与少量机制
抽象暴露接口、隐藏细节
继承基于父类扩展,注意 super() 与 MRO(多重继承)
多态同一接口,不同实现;Python 中鸭子类型很普遍

参考