Python3入门指南Python语言的特点和实际应用Python3环境搭建配置VSCode进行Python开发Python基础语法Python变量与数据类型Python数据类型转换Python解释器使用Python注释使用Python运算符Python数字类型Python字符串操作Python列表操作Python元组使用Python字典使用Python集合使用Python条件控制详解Python循环语句详解Python编程入门实践Python推导式详解Python迭代器和生成器Python with语句详解Python函数详解Python lambda(匿名函数)Python装饰器Python数据结构Python模块和包使用Python中__name__和__main__的用法Python输入输出:从基础到文件操作Python文件操作Python OS模块使用Python错误和异常处理Python面向对象编程Python命名空间和作用域Python虚拟环境:venv详细教程Python类型注解Python标准库常用模块Python正则表达式Python CGI编程Python MySQL(mysql-connector驱动)Python MySQL(PyMySQL驱动)Python网络编程Python发送邮件Python多线程编程Python XML解析Python JSON解析Python日期和时间处理Python操作MongoDBPython urllib库使用Python uWSGI 安装与配置Python pip包管理工具Python operator模块Python math模块Python requests模块HTTP请求Python random模块Python OpenAI库Python AI绘画制作Python statistics模块Python hashlib模块:哈希加密Python量化交易Python pyecharts数据可视化Python Selenium网页自动化Python BeautifulSoup网页数据提取Python Scrapy爬虫框架Python Markdown转HTMLPython sys模块Python Pickle模块:数据存储Python subprocess模块Python queue队列模块Python StringIO内存文件操作Python logging日志记录Python datetime日期时间处理Python re正则表达式Python csv表格数据处理Python threading 多线程编程Python asyncio 异步编程Python PyQt 图形界面开发Python 应用方向和常用库框架

Python面向对象编程

面向对象编程是一种重要的编程思想。Python从设计开始就支持面向对象编程,这让Python在处理复杂程序时更加得心应手。


什么是面向对象编程?

面向对象编程把程序中的各种元素看作对象。每个对象都有自己的属性和行为。这种编程方式让代码更容易组织和维护。

主要概念:

  • :对象的模板,定义了对象的属性和方法

  • 对象:类的具体实例

  • 属性:对象具有的特征

  • 方法:对象能够执行的操作

  • 继承:子类可以继承父类的特性

  • 封装:把数据和操作数据的方法包装在一起


创建第一个类

在Python中,使用class关键字来定义类。

class Student:
    """一个学生类"""
    
    # 类属性,所有学生对象共享
    school = "阳光小学"
    
    def __init__(self, name, age):
        # 实例属性,每个学生对象独有的
        self.name = name
        self.age = age
    
    def introduce(self):
        """自我介绍方法"""
        print(f"我叫{self.name},今年{self.age}岁,在{self.school}上学")

# 创建学生对象
student1 = Student("小明", 12)
student2 = Student("小红", 11)

# 使用对象的方法
student1.introduce()  # 输出:我叫小明,今年12岁,在阳光小学上学
student2.introduce()  # 输出:我叫小红,今年11岁,在阳光小学上学


理解self参数

在类的方法中,第一个参数通常是self,它代表对象本身。

class Person:
    def __init__(self, name, age):
        self.name = name  # 设置实例属性
        self.age = age
    
    def say_hello(self):
        print(f"你好,我是{self.name}")

# 创建对象时,不需要传递self参数
person = Person("李华", 20)
person.say_hello()  # 输出:你好,我是李华

self是Python的约定,你也可以用其他名字,但为了代码清晰,建议始终使用self。


类的构造方法

__init__是一个特殊方法,在创建对象时自动调用。

class Book:
    def __init__(self, title, author, price):
        self.title = title
        self.author = author
        self.price = price
        self.is_borrowed = False  # 默认值
    
    def borrow(self):
        """借书方法"""
        if self.is_borrowed:
            print(f"《{self.title}》已经被借走了")
        else:
            self.is_borrowed = True
            print(f"成功借阅《{self.title}》")
    
    def return_book(self):
        """还书方法"""
        self.is_borrowed = False
        print(f"已归还《{self.title}》")

# 使用类
book1 = Book("Python编程", "张老师", 45.0)
book1.borrow()      # 输出:成功借阅《Python编程》
book1.borrow()      # 输出:《Python编程》已经被借走了
book1.return_book() # 输出:已归还《Python编程》


类的继承

继承让子类可以获得父类的属性和方法。

单继承

class Animal:
    """动物基类"""
    def __init__(self, name, age):
        self.name = name
        self.age = age
    
    def eat(self):
        print(f"{self.name}在吃东西")
    
    def sleep(self):
        print(f"{self.name}在睡觉")

class Dog(Animal):
    """狗类,继承自动物类"""
    def __init__(self, name, age, breed):
        super().__init__(name, age)  # 调用父类的构造方法
        self.breed = breed  # 狗特有的属性
    
    def bark(self):
        """狗特有的方法"""
        print(f"{self.name}在汪汪叫")
    
    # 重写父类方法
    def eat(self):
        print(f"{self.name}在吃狗粮")

# 使用继承
my_dog = Dog("旺财", 3, "金毛")
my_dog.eat()    # 输出:旺财在吃狗粮(重写后的方法)
my_dog.sleep()  # 输出:旺财在睡觉(继承的方法)
my_dog.bark()   # 输出:旺财在汪汪叫(子类特有方法)

多继承

一个类可以继承多个父类。

class Camera:
    """相机类"""
    def take_photo(self):
        print("拍照")

class Phone:
    """手机类"""
    def make_call(self, number):
        print(f"拨打电话:{number}")

class SmartPhone(Camera, Phone):
    """智能手机类,继承相机和手机的功能"""
    def __init__(self, brand):
        self.brand = brand
    
    def use_app(self, app_name):
        print(f"使用{app_name}应用")

# 使用多继承
my_phone = SmartPhone("华为")
my_phone.make_call("13800138000")  # 输出:拨打电话:13800138000
my_phone.take_photo()              # 输出:拍照
my_phone.use_app("微信")           # 输出:使用微信应用


访问控制

Python使用命名约定来控制属性和方法的访问权限。

class BankAccount:
    """银行账户类"""
    def __init__(self, account_holder, initial_balance):
        self.account_holder = account_holder  # 公开属性
        self._account_id = "123456"           # 受保护属性(单下划线)
        self.__balance = initial_balance      # 私有属性(双下划线)
    
    # 公开方法
    def deposit(self, amount):
        """存款"""
        if amount > 0:
            self.__balance += amount
            print(f"存款成功,当前余额:{self.__balance}")
        else:
            print("存款金额必须大于0")
    
    def withdraw(self, amount):
        """取款"""
        if 0 < amount <= self.__balance:
            self.__balance -= amount
            print(f"取款成功,当前余额:{self.__balance}")
        else:
            print("取款金额无效")
    
    def get_balance(self):
        """获取余额(通过公开方法访问私有属性)"""
        return self.__balance

# 使用银行账户
account = BankAccount("张三", 1000)
account.deposit(500)    # 输出:存款成功,当前余额:1500
account.withdraw(200)   # 输出:取款成功,当前余额:1300

print(account.account_holder)  # 可以访问:张三
print(account.get_balance())   # 通过方法访问:1300

# 这些访问会出问题
# print(account.__balance)     # 错误!无法直接访问私有属性


实际应用示例

示例1:电商系统用户管理

class User:
    """用户基类"""
    def __init__(self, username, email):
        self.username = username
        self.email = email
        self.__password = None
    
    def set_password(self, password):
        """设置密码"""
        if len(password) >= 6:
            self.__password = password
            print("密码设置成功")
        else:
            print("密码长度至少6位")
    
    def check_password(self, password):
        """验证密码"""
        return self.__password == password

class Customer(User):
    """顾客类"""
    def __init__(self, username, email):
        super().__init__(username, email)
        self.cart = []  # 购物车
        self.orders = []  # 订单历史
    
    def add_to_cart(self, product):
        """添加商品到购物车"""
        self.cart.append(product)
        print(f"已添加{product}到购物车")
    
    def view_cart(self):
        """查看购物车"""
        if self.cart:
            print("购物车内容:")
            for item in self.cart:
                print(f" - {item}")
        else:
            print("购物车为空")

class Admin(User):
    """管理员类"""
    def __init__(self, username, email, admin_level):
        super().__init__(username, email)
        self.admin_level = admin_level
    
    def manage_products(self):
        """管理商品"""
        print("正在管理商品...")
    
    def view_statistics(self):
        """查看统计信息"""
        print("正在查看统计信息...")

# 使用示例
customer = Customer("shopper1", "shopper@fly63.com")
customer.set_password("123456")
customer.add_to_cart("Python编程书籍")
customer.add_to_cart("鼠标")
customer.view_cart()

admin = Admin("admin1", "admin@fly63.com", "超级管理员")
admin.manage_products()

示例2:图形计算

import math

class Shape:
    """图形基类"""
    def area(self):
        """计算面积"""
        pass
    
    def perimeter(self):
        """计算周长"""
        pass

class Rectangle(Shape):
    """矩形类"""
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    def perimeter(self):
        return 2 * (self.width + self.height)

class Circle(Shape):
    """圆形类"""
    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

class Triangle(Shape):
    """三角形类"""
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
    
    def area(self):
        # 使用海伦公式计算面积
        s = (self.a + self.b + self.c) / 2
        return math.sqrt(s * (s - self.a) * (s - self.b) * (s - self.c))
    
    def perimeter(self):
        return self.a + self.b + self.c

# 使用图形类
shapes = [
    Rectangle(5, 3),
    Circle(4),
    Triangle(3, 4, 5)
]

for shape in shapes:
    print(f"图形面积: {shape.area():.2f}")
    print(f"图形周长: {shape.perimeter():.2f}")
    print("-" * 20)


特殊方法

Python类中有一些特殊方法,以双下划线开头和结尾。

class Vector:
    """向量类"""
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __str__(self):
        """定义打印对象时的显示"""
        return f"向量({self.x}, {self.y})"
    
    def __add__(self, other):
        """定义加法运算"""
        return Vector(self.x + other.x, self.y + other.y)
    
    def __mul__(self, scalar):
        """定义乘法运算"""
        return Vector(self.x * scalar, self.y * scalar)
    
    def __len__(self):
        """定义长度(向量的模)"""
        return int((self.x**2 + self.y**2)**0.5)

# 使用特殊方法
v1 = Vector(2, 3)
v2 = Vector(1, 4)

print(v1)           # 输出:向量(2, 3)
print(v1 + v2)      # 输出:向量(3, 7)
print(v1 * 3)       # 输出:向量(6, 9)
print(len(v1))      # 输出:3


面向对象编程的优势

  1. 代码复用:通过继承可以重用已有的代码

  2. 易于维护:相关功能组织在一起,修改方便

  3. 扩展性好:可以通过继承添加新功能

  4. 模拟现实:用对象模拟现实世界的事物更直观


最佳实践建议

  1. 类名使用驼峰命名法:MyClass而不是my_class

  2. 一个类负责一个主要功能:保持类的单一职责

  3. 合理使用继承:不要过度使用继承

  4. 优先使用组合:对象包含其他对象,而不是过度继承

  5. 提供清晰的文档:为类和方法添加文档字符串

class Car:
    """汽车类"""
    
    def __init__(self, brand, model):
        self.brand = brand
        self.model = model
        self.engine = Engine()  # 组合:汽车包含发动机
        self.wheels = [Wheel() for _ in range(4)]  # 组合:汽车包含轮子

class Engine:
    """发动机类"""
    pass

class Wheel:
    """轮子类"""
    pass

掌握面向对象编程,能够让你写出更加结构清晰、易于维护的Python代码。从简单的类开始练习,逐步构建更复杂的对象关系。

本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!

链接: https://fly63.com/course/36_2104

目录选择