Python 进阶 - 第十三节


📋 本节要点

知识点 说明
类 对象的模板/蓝图
对象 类的具体实例
__init__ 创建对象时自动调用,初始化属性
self 指向当前对象本身
类属性 所有对象共享的数据
实例属性 每个对象独有的数据
hasattr() 检查对象是否有指定属性
封装 将数据和行为打包在类内部

1. 类与对象

面向对象编程(OOP)将数据(属性)和行为(方法)封装在一起。类是模板/蓝图,对象是根据模板创建的具体实例。

class 类名:
    # 属性
    属性名 = 值

    # 方法
    def 方法名(self, 参数):
        方法体

核心概念:类(Class)— 抽象的模板,定义对象的属性和行为;对象(Object)— 类的实例,具体的存在;属性(Attribute)— 对象的特征/数据;方法(Method)— 对象的行为/函数。


2. 创建类与对象

最简单的类用 pass 占位,类名通常使用大驼峰命名法。

class Student:
    pass

bart = Student()
bart.name = "Bart Simpson"  # 动态添加属性
print(bart.name)            # Bart Simpson

# isinstance() 检查对象是否是某个类的实例
print(isinstance(bart, Student))  # True

3. init 与 self

__init__ 是初始化方法,在创建对象时自动调用,用于初始化对象的属性。self 代表对象本身,用于在类的内部访问自己的属性和方法。

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

    def bark(self):
        print(f"{self.name} 汪汪叫")

    def eat(self):
        self.bark()  # 方法内部调用其他方法
        print(f"{self.name} 吃骨头")

# 创建对象时传入参数
dog1 = Dog("旺财", 3)
dog2 = Dog("小白", 2)

# 访问属性
print(dog1.name, dog1.age)  # 旺财 3
print(dog2.name, dog2.age)  # 小白 2

# 调用方法
dog1.bark()  # 旺财 汪汪叫
dog2.eat()   # 小白 汪汪叫 \n 小白 吃骨头

4. 属性操作

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

p = Person("张三")

# 获取属性
print(p.name)        # 张三

# 修改属性
p.name = "王五"
print(p.name)        # 王五

# 添加新属性
p.age = 20
print(p.age)         # 20

# 删除属性
# del p.name

# 检查属性是否存在
print(hasattr(p, "name"))  # True
print(hasattr(p, "score")) # False

5. 类属性(Class Attribute)

类属性在类内部直接定义,所有对象共享同一个类属性。通过类名修改类属性,所有对象都会感知到。

class Person:
    head = 1  # 类属性

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

p = Person("张三")
q = Person("李四")

# 访问类属性
print(p.head, q.head)  # 1 1

# 通过类名修改类属性(全局生效)
Person.head = 2
print(p.head, q.head)  # 2 2

# 动态添加类属性
Person.finger = 10
print(p.finger, q.finger)  # 10 10

类属性 vs 实例属性:类属性所有对象共享,修改一处全局生效;实例属性每个对象独有,互不影响。


6. 封装与参数验证

封装将数据(属性)和操作数据的方法打包在类内部,隐藏实现细节,保护数据安全。

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

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

lisa = Student("Lisa", 99)
bart = Student("Bart", 59)
print(lisa.name, lisa.get_grade())  # Lisa A
print(bart.name, bart.get_grade())  # Bart C

7. 实战案例:学生信息管理

class Student:
    def __init__(self, name, age, score):
        self.name = name
        self.age = age
        self.score = score

    def show_info(self):
        print(f"姓名:{self.name}")
        print(f"年龄:{self.age}")
        print(f"成绩:{self.score}")

    def get_grade(self):
        if self.score >= 90:
            return "A"
        elif self.score >= 80:
            return "B"
        elif self.score >= 70:
            return "C"
        elif self.score >= 60:
            return "D"
        else:
            return "E"

# 创建学生对象
s1 = Student("张三", 18, 85)
s2 = Student("李四", 19, 92)

s1.show_info()
print("等级:", s1.get_grade())

print("---")

s2.show_info()
print("等级:", s2.get_grade())

运行结果:

姓名:张三
年龄:18
成绩:85
等级:B
---
姓名:李四
年龄:19
成绩:92
等级:A

下一节预告:继承与多态