学无止境

少年辛苦终身事,莫向光阴惰寸功。——唐·杜荀鹤《题弟侄书堂》


Python面向对象编程详解

  • object oriented programming
  • OOP面向对象程序设计
  • java C#只支持面向对象编程
  • python既支持面向过程编程也支持面向对象编程

1. 面向对象编程基础

1.1 什么是面向对象编程

面向对象编程(Object-Oriented Programming, OOP)是一种程序设计范式,它将数据和操作数据的方法组织到对象中。

1.2 Python的编程范式支持

  • 支持面向过程编程
  • 支持面向对象编程
  • 支持函数式编程

2. 类的定义与使用

2.1 基本语法

class ClassName(object):
    """类的文档字符串"""
    
    # 类属性
    class_attribute = None
    
    # 初始化方法
    def __init__(self, param1, param2):
        self.param1 = param1  # 实例属性
        self.param2 = param2
    
    # 实例方法
    def instance_method(self):
        print(f"处理 {self.param1}")

2.2 命名规范

  • 类名使用CamelCase命名法
  • 方法和属性使用lowercase_with_underscores命名法
  • 私有属性和方法前加双下划线__

2.3 实例化示例

# 创建学生类
class Student(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def introduce(self):
        return f"我是{self.name},今年{self.age}岁"

# 实例化
student1 = Student("张三", 18)
student2 = Student("李四", 20)

print(student1.introduce())  # 输出:我是张三,今年18岁

3. self关键字详解

3.1 self的作用

self代表类的实例本身,用于在类中访问实例的属性和方法。

3.2 self的使用规范

class Example:
    def method1(self):  # self是推荐的命名
        return "使用self"
    
    def method2(this):  # 可以使用其他名称,但不推荐
        return "使用this"
    
    def method3(self, param):  # self必须是第一个参数
        return f"self和其他参数: {param}"

3.3 self的工作原理

class Car:
    def __init__(self, brand):
        self.brand = brand
    
    def show_brand(self):
        print(f"这是一辆{self.brand}")

# 两种等价的调用方式
car = Car("Toyota")
car.show_brand()           # 方式1:通过实例调用
Car.show_brand(car)        # 方式2:通过类调用(显式传递self)

4. 特殊方法

4.1 __init__方法

class Person:
    def __init__(self, name, age):
        """
        初始化方法,创建实例时自动调用
        """
        self.name = name
        self.age = age
        print(f"创建了一个新的Person实例:{name}")

4.2 __str__方法

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author
    
    def __str__(self):
        """定义对象的字符串表示"""
        return f"《{self.title}》 作者:{self.author}"

# 使用示例
book = Book("Python编程", "张三")
print(book)  # 输出:《Python编程》 作者:张三

5. 属性访问控制

5.1 Getter和Setter方法

class BankAccount:
    def __init__(self):
        self.__balance = 0  # 私有属性
    
    def get_balance(self):
        """获取余额"""
        return self.__balance
    
    def set_balance(self, amount):
        """设置余额"""
        if amount >= 0:
            self.__balance = amount
        else:
            raise ValueError("余额不能为负数")

# 使用示例
account = BankAccount()
account.set_balance(1000)
print(account.get_balance())  # 1000

5.2 使用Property装饰器

class Person:
    def __init__(self):
        self.__age = 0
    
    @property
    def age(self):
        """年龄获取器"""
        return self.__age
    
    @age.setter
    def age(self, value):
        """年龄设置器"""
        if 0 <= value <= 150:
            self.__age = value
        else:
            raise ValueError("年龄必须在0-150之间")

# 使用示例
person = Person()
person.age = 25  # 使用setter
print(person.age)  # 使用getter

6. 实践建议

6.1 封装原则

  1. 使用私有属性(双下划线前缀)隐藏实现细节
  2. 提供公共方法访问私有属性
  3. 在setter方法中进行数据验证

6.2 命名规范

class StudentManager:
    def __init__(self):
        self.__students = []  # 私有属性用双下划线
        self._school = "清华"  # 保护属性用单下划线
        self.version = "1.0"  # 公共属性直接命名
    
    def add_student(self, student):  # 方法用小写加下划线
        """添加学生"""
        self.__students.append(student)

6.3 文档字符串

class Database:
    """数据库连接类
    
    用于管理数据库连接和执行数据库操作
    
    Attributes:
        host: 数据库主机地址
        port: 数据库端口
        username: 用户名
    """
    
    def connect(self):
        """建立数据库连接
        
        Returns:
            bool: 连接成功返回True,否则返回False
        """
        pass