Python核心编程:类、对象、属性和方法

1. 面向对象编程思想

1.1. 面向过程

面向过程编程是一种以过程为中心的编程思想,主要关注“怎么做”的问题,将程序分解为一系列步骤或函数。

思考: 想象你要做一顿饭,面向过程就像写一个菜谱:

  1. 洗菜
  2. 切菜
  3. 热锅
  4. 炒菜
  5. 装盘

示例:

# 计算学生平均成绩 - 面向过程方式
def calculate_average(scores):
    return sum(scores) / len(scores)

def get_grade(score):
    if score >= 90:
        return "A"
    elif score >= 80:
        return "B"
    else:
        return "C"

# 使用函数
student_scores = [85, 92, 78, 90]
average = calculate_average(student_scores)
grade = get_grade(average)
print(f"平均分: {average}, 等级: {grade}")

1.2. 面向对象

面向对象编程是一种以对象为中心的编程思想,主要关注“谁来做”的问题,将程序组织为相互协作的对象。

思考: 同样是做饭,面向对象会这样思考:

  • 厨师对象:负责烹饪
  • 食材对象:具有各种属性
  • 厨具对象:提供烹饪工具

示例:

 # 计算学生平均成绩 - 面向对象方式
 # 学生类
class Student:
	# 构造方法,用于在创建对象时设置其初始状态
    def __init__(self, name, scores):
        self.name = name
        self.scores = scores
        
    # 方法
    def calculate_average(self):
        return sum(self.scores) / len(self.scores)
        
    # 方法
    def get_grade(self):
        average = self.calculate_average()
        if average >= 90:
            return "A"
        elif average >= 80:
            return "B"
        else:
            return "C"

# 使用对象
student = Student("张三", [85, 92, 78, 90])
print(f"{student.name}的平均分: {student.calculate_average()}, 等级: {student.get_grade()}")

1.3. 对比小结

方面面向过程面向对象
核心思想步骤和函数对象和类
数据与操作分离封装在一起
重点算法和逻辑数据和关系
适用场景简单任务、脚本复杂系统、大型项目
代码复用函数复用类继承、对象复用

思考: 什么时候用面向对象?当你要描述现实世界中的事物及其关系时,面向对象更自然。

2. 类和对象的基本概念

2.1. 类和对象的关系

类: 是抽象的模板,定义了一类对象的共同特征和行为。

对象: 是类的具体实例,具有类定义的属性和方法。

比如说人是一个类,那么对于具体的个人,就可以说是一个对象,而姓名、年龄等就是我的属性。

2.2. 类的定义

使用关键字:class 对类进行定义

示例: 定义一个简单的学生类:

class Student:
    # 类属性(所有对象共享)
    school = "希望小学"
    
    def __init__(self, name, age):
        # 实例属性(每个对象独有)
        self.name = name
        self.age = age
    
    # 实例方法
    def introduce(self):
        return f"我叫{self.name},今年{self.age}岁,在{self.school}上学"

2.3. 实例化对象

对象名 = 类名(“属性的值”)

示例: 创建学生对象

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

# 使用对象
print(student1.introduce())  # 我叫小明,今年12岁,在希望小学上学
print(student2.introduce())  # 我叫小红,今年11岁,在希望小学上学

2.4. self关键字

self指向当前对象实例,在方法中用于访问对象的属性和其他方法。

class Test:
    def method_without_self():
        print("这个方法没有self")
    
    def method_with_self(self):
        print("这个方法有self")

# 测试
obj = Test()
# obj.method_without_self()  # 错误!缺少参数
obj.method_with_self()        # 正确!Python自动传递obj作为self

3. 属性

3.1. 属性的概念

属性是对象的状态或特征,描述对象“有什么”。

3.2. 实例属性与类属性

3.2.1. 实例属性

  • 属于单个对象实例
  • 每个对象有自己的副本
  • 通过self.属性名定义

示例:

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

dog1 = Dog("旺财", "金毛")
dog2 = Dog("小黑", "拉布拉多")

print(dog1.name)  # 旺财
print(dog2.name)  # 小黑 - 每个对象有自己的name

3.2.2. 类属性

  • 属于类,所有对象共享
  • 在类内部、方法外部定义
  • 修改会影响所有对象

示例:

class Dog:
    # 类属性
    species = "犬科动物"
    count = 0
    
    def __init__(self, name):
        self.name = name
        Dog.count += 1  # 统计创建了多少个对象

print(f"狗的物种: {Dog.species}")

dog1 = Dog("旺财")
dog2 = Dog("小黑")

print(f"创建了{Dog.count}只狗")  # 创建了2只狗

# 修改类属性会影响所有对象
Dog.species = "哺乳动物"
print(dog1.species)  # 哺乳动物
print(dog2.species)  # 哺乳动物

3.3. 属性的动态绑定

Python允许在运行时动态添加属性。
这种灵活性有利有弊,需要谨慎使用!

class Person:
    def __init__(self, name):
        self.name = name

person = Person("张三")

# 动态添加属性
person.age = 25
person.city = "北京"

print(f"{person.name}, {person.age}岁, 来自{person.city}")

# 动态删除属性
del person.city
# print(person.city)  # 报错:属性不存在

4. 方法

4.1. 实例方法

  • 最常用的方法类型
  • 第一个参数必须是self
  • 可以访问和修改实例属性和类属性
class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
    
    # 实例方法
    def deposit(self, amount):
        """存款"""
        self.balance += amount
        return f"存款{amount}成功,当前余额:{self.balance}"
    
    def withdraw(self, amount):
        """取款"""
        if amount <= self.balance:
            self.balance -= amount
            return f"取款{amount}成功,当前余额:{self.balance}"
        else:
            return "余额不足"

# 使用
account = BankAccount("李四", 1000)
print(account.deposit(500))   # 存款500成功,当前余额:1500
print(account.withdraw(200))  # 取款200成功,当前余额:1300

4.2. 类方法

  • 使用 @classmethod 装饰器
  • 第一个参数是cls(类本身)
  • 主要用于操作类属性或创建替代构造函数

示例:

class Student:
    count = 0

    def __init__(self, name):
        self.name = name
        Student.count += 1

    @classmethod
    def get_count(cls):
        return cls.count

    @classmethod
    def from_string(cls, student_str):
        """替代构造函数:从字符串创建对象"""
        name = student_str.split(",")[0]  # 只取名字部分
        return cls(name)

# 使用
student3 = Student.from_string("小刚,15")
print(student3.name)  # 小刚

4.3. 静态方法

  • 使用 @staticmethod装饰器
  • 不需要selfcls参数
  • 与类相关,但不依赖类或实例的辅助函数

示例:

class MathUtils:
    @staticmethod
    def add(x, y):
        return x + y
    
    @staticmethod
    def is_even(number):
        return number % 2 == 0
    
    @staticmethod
    def calculate_circle_area(radius):
        return 3.14159 * radius ** 2

# 使用静态方法
print(MathUtils.add(5, 3))           # 8
print(MathUtils.is_even(10))         # True
print(MathUtils.calculate_circle_area(5))  # 78.53975

# 也可以通过对象调用
utils = MathUtils()
print(utils.add(2, 2))  # 4

5. 初始化和析构

5.1. __init__方法

Python中最重要的特殊方法之一,被称为构造方法或初始化方法。 它在创建对象时自动调用,用于初始化对象的属性。

示例:

class Car:
    def __init__(self, brand, model, year):
        print("正在初始化汽车对象...")
        self.brand = brand
        self.model = model
        self.year = year
        self.mileage = 0  # 默认值
    
    def drive(self, distance):
        self.mileage += distance
        return f"行驶了{distance}公里,总里程:{self.mileage}"

# 创建对象时自动调用__init__
my_car = Car("丰田", "凯美瑞", 2022)
print(my_car.drive(100))  # 行驶了100公里,总里程:100

5.2. __del__方法

Python中的一个特殊方法,称为析构器或析构方法。__del__方法在对象被销毁时自动调用,用于执行清理操作。但需要注意的是,Python有自动垃圾回收机制,所以__del__的调用时机可能不是那么直观。

class Student:
    def __init__(self, name):
        self.name = name
        print(f"{self.name}被创建了")

    def __del__(self):
        print(f"{self.name}被销毁了")

s1 = Student("小明")

del s1  # 手动删除对象引用
print("程序继续执行")

输出:
在这里插入图片描述
可以对del s1 进行注释,比对输出效果更好理解。

5.3. __str__方法

_str_ 方法应该返回一个可读性好的字符串,通常用于显示给最终用户。当使用print()函数str()函数或在字符串格式化中引用对象时,Python会自动调用这个方法。

示例:

class Student:
    def __init__(self, name, age, grade):
        self.name = name
        self.age = age
        self.grade = grade
    
    # __str__方法必须有返回值
    def __str__(self):
        return f"学生信息: 姓名={self.name}, 年龄={self.age}, 年级={self.grade}"

# 使用示例
student = Student("张三", 15, "高一")
print(student)  # 自动调用__str__
# 输出: 学生信息: 姓名=张三, 年龄=15, 年级=高一

# 等价于
print(student.__str__())
print(str(student))

输出:
在这里插入图片描述

综合示例: 完整的类设计

class Book:
    # 类属性
    library_name = "城市图书馆"
    
    def __init__(self, title, author, pages):
        # 实例属性
        self.title = title
        self.author = author
        self.pages = pages
        self.is_borrowed = False
    
    # 实例方法
    def borrow(self):
        if not self.is_borrowed:
            self.is_borrowed = True
            return f"《{self.title}》借阅成功"
        else:
            return f"《{self.title}》已被借出"
    
    def return_book(self):
        if self.is_borrowed:
            self.is_borrowed = False
            return f"《{self.title}》归还成功"
        else:
            return f"《{self.title}》未被借出"
    
    # 类方法
    @classmethod
    def change_library(cls, new_name):
        cls.library_name = new_name
        return f"图书馆已更名为:{new_name}"
    
    # 静态方法
    @staticmethod
    def is_valid_book(title, author, pages):
        return len(title) > 0 and len(author) > 0 and pages > 0
    
    # 析构方法
    def __del__(self):
        print(f"《{self.title}》对象已被销毁")

# 使用示例
book1 = Book("Python编程", "John Doe", 300)
book2 = Book("数据科学", "Jane Smith", 400)

print(book1.borrow())  # 《Python编程》借阅成功
print(book2.borrow())  # 《数据科学》借阅成功
print(book1.return_book())  # 《Python编程》归还成功

print(Book.change_library("数字图书馆"))  # 图书馆已更名为:数字图书馆

print(Book.is_valid_book("", "作者", 100))  # False - 书名不能为空
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值