Python3 面向对象

Python3面向对象编程完全指南

Python3 面向对象编程完全指南

专为编程小白设计,用大白话解释面向对象编程核心概念

面向对象编程的核心思想

面向对象编程(OOP)就像用乐高积木搭建模型:

  1. 类(Class) – 相当于乐高的设计图纸,定义了积木的形状和连接方式
  2. 对象(Object) – 根据图纸实际拼装出来的乐高模型
  3. 属性(Attributes) – 模型的特征,比如颜色、大小
  4. 方法(Methods) – 模型能做的事情,比如移动、发光
  5. 继承(Inheritance) – 在现有图纸基础上添加新功能,创造新模型
  6. 封装(Encapsulation) – 把模型的内部结构隐藏起来,只暴露外部接口
  7. 多态(Polymorphism) – 不同模型对同一指令做出不同响应

类和对象

是创建对象的蓝图或模板,定义了对象的基本结构和行为。

对象是根据类创建的具体实例,每个对象都是独立的。

现实比喻:类就像是汽车的设计图纸,对象就是根据图纸制造出来的具体汽车。

创建类

class Dog: # 定义Dog类
    def __init__(self, name, age): # 构造方法
        self.name = name # 实例属性
        self.age = age

    def bark(self): # 实例方法
        print(f”{self.name} says: Woof!”)

创建对象

# 创建Dog类的实例
my_dog = Dog(“Buddy”, 3)
print(my_dog.name) # 输出: Buddy
my_dog.bark() # 输出: Buddy says: Woof!
注意:self参数代表对象自身,在调用方法时Python会自动传递,不需要手动传入。

属性和方法

属性类型

实例属性:属于特定对象的属性,每个对象有自己的属性值

类属性:属于类本身的属性,所有对象共享

class Dog:
    species = “Canis familiaris” # 类属性

    def __init__(self, name):
        self.name = name # 实例属性

dog1 = Dog(“Buddy”)
dog2 = Dog(“Max”)
print(dog1.species) # 输出: Canis familiaris
print(dog2.species) # 输出: Canis familiaris

方法类型

实例方法:操作对象实例属性的方法

类方法:操作类属性的方法,使用@classmethod装饰器

静态方法:与类相关但不操作类或实例属性的方法,使用@staticmethod装饰器

class MyClass:
    def instance_method(self): # 实例方法
        print(“调用实例方法”)

    @classmethod
    def class_method(cls): # 类方法
        print(“调用类方法”)

    @staticmethod
    def static_method(): # 静态方法
        print(“调用静态方法”)

继承和多态

继承

允许一个类(子类)继承另一个类(父类)的属性和方法。

class Animal: # 父类
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(“动物发出声音”)

class Dog(Animal): # 子类继承Animal
    def speak(self): # 重写父类方法
        print(f”{self.name} says: Woof!”)

class Cat(Animal):
    def speak(self):
        print(f”{self.name} says: Meow!”)

多态

不同类的对象对同一方法调用做出不同响应。

def animal_sound(animal):
    animal.speak() # 多态调用

dog = Dog(“Buddy”)
cat = Cat(“Whiskers”)
animal_sound(dog) # 输出: Buddy says: Woof!
animal_sound(cat) # 输出: Whiskers says: Meow!
现实比喻:继承就像父子关系,孩子继承了父亲的特点但又有自己的个性;多态就像不同乐器对”演奏”指令会发出不同的声音。

封装和访问控制

封装

将数据(属性)和操作数据的方法捆绑在一起,并隐藏内部实现细节。

访问控制

Python中没有真正的私有属性,但可以通过命名约定实现:

  • 公开属性:普通命名,如:name
  • 受保护属性:单下划线开头,如:_age (约定上视为受保护)
  • 私有属性:双下划线开头,如:__id (会进行名称修饰)
class BankAccount:
    def __init__(self, account_holder):
        self.account_holder = account_holder # 公开属性
        self._balance = 0 # 受保护属性
        self.__pin = “1234” # 私有属性

    def deposit(self, amount): # 公开方法
        if amount > 0:
            self._balance += amount

    def get_balance(self):
        return self._balance

account = BankAccount(“Alice”)
account.deposit(100)
print(account.account_holder) # 正常访问
print(account._balance) # 可以访问但不建议
print(account.__pin) # 报错,不能直接访问私有属性
提示:Python的私有属性是通过名称修饰(name mangling)实现的,实际名称会变为_类名__属性名。例如__pin实际变为_BankAccount__pin。

特殊方法(魔术方法)

以双下划线开头和结尾的方法,用于实现类的特殊行为。

常用魔术方法

  • __init__: 构造方法,创建对象时调用
  • __str__: 返回对象的字符串表示,用于print()
  • __repr__: 返回对象的官方字符串表示
  • __len__: 定义对象的长度
  • __add__: 定义对象相加的行为
  • __eq__: 定义对象相等的比较
class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f”Vector({self.x}, {self.y})”

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

v1 = Vector(2, 3)
v2 = Vector(3, 4)
print(v1) # 输出: Vector(2, 3)
v3 = v1 + v2
print(v3) # 输出: Vector(5, 7)
print(v1 == v2) # 输出: False
理解:魔术方法就像给对象添加超能力,让它们支持Python内置操作(如+、==、len()等)。

面向对象设计原则

SOLID原则

  • 单一职责原则:一个类只负责一件事
  • 开闭原则:对扩展开放,对修改关闭
  • 里氏替换原则:子类可以替换父类
  • 接口隔离原则:使用多个专用接口而非单一总接口
  • 依赖倒置原则:依赖抽象而非具体实现

其他重要原则

组合优于继承:优先使用组合(将一个类的实例作为另一个类的属性)而不是继承

# 组合示例
class Engine:
    def start(self):
        print(“引擎启动”)

class Car:
    def __init__(self):
        self.engine = Engine() # 组合

    def start(self):
        self.engine.start()

my_car = Car()
my_car.start() # 输出: 引擎启动
建议:作为初学者,可以先理解单一职责原则和组合优于继承,随着经验积累再学习其他原则。

面向对象编程实践建议

  • 从简单开始:先尝试创建简单的类和对象,理解基本概念
  • 命名清晰:类名使用大写开头的驼峰命名法,方法名使用小写开头的蛇形命名法
  • 合理使用继承:避免过深的继承层次(通常不超过3层)
  • 优先使用组合:组合比继承更灵活,耦合度更低
  • 封装细节:只暴露必要的接口,隐藏内部实现
  • 善用多态:编写通用代码处理不同类的对象
  • 适度使用:不是所有情况都需要面向对象,简单脚本用函数式更合适

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部