
浙大疏锦行Python 类Class类是 Python 面向对象编程OOP的核心是对一类具有相同属性和行为的事物的抽象。通过类我们可以封装数据、定义行为逻辑实现代码的复用、扩展与高内聚性。本教程将从基础到进阶全面讲解 Python 类的核心知识点与实战用法。一、类的基础定义与创建1. 类的核心概念类Class抽象的模板定义了一类事物的属性和方法比如Circle类、Person类。实例Instance类的具体对象通过类创建拥有类定义的所有属性和方法比如Circle(5)是Circle类的实例。属性类中定义的变量分为实例属性、类属性。方法类中定义的函数分为实例方法、类方法、静态方法。2. 类的基本语法使用class关键字定义类类名遵循大驼峰命名法首字母大写。python运行# 定义基础类class 类名:# 类的文档字符串可选用于说明类功能类的说明文档# 类的属性和方法def 方法名(self, 参数):方法体3. 构造方法__init__与实例属性__init__是类的构造方法创建实例时自动调用用于初始化实例的属性。self代表实例本身是实例方法的必传参数。python运行# 定义Person类class Person:人类封装姓名、年龄属性和说话行为# 构造方法初始化实例属性def __init__(self, name, age18):# 实例属性每个实例独立拥有self.name nameself.age age# 创建Person类的实例person1 Person(小明, 20) # 传入参数初始化属性person2 Person(小红) # age使用默认值18# 访问实例属性print(person1.name) # 输出小明print(person2.age) # 输出18二、类的方法详解Python 类中包含三种核心方法各自的用途和使用场景不同。1. 实例方法定义在类中直接定义第一个参数必须是self只能通过实例调用。特点可以访问和修改实例属性self代表调用该方法的实例。python运行class Person:def __init__(self, name, age):self.name nameself.age age# 实例方法访问实例属性def introduce(self):return f我叫{self.name}今年{self.age}岁# 实例方法修改实例属性def grow_up(self):self.age 1# 调用实例方法p Person(小李, 25)print(p.introduce()) # 输出我叫小李今年25岁p.grow_up()print(p.age) # 输出262. 类方法定义使用classmethod装饰器第一个参数必须是cls代表类本身。特点只能访问类属性不能访问实例属性可通过类名或实例调用常用于创建类的替代构造器。python运行class Person:# 类属性所有实例共享species 人类def __init__(self, name, age):self.name nameself.age age# 类方法classmethoddef get_species(cls):# 访问类属性return cls.species# 类方法替代构造器从字符串创建实例classmethoddef from_string(cls, info):name, age info.split(-)return cls(name, int(age))# 调用类方法print(Person.get_species()) # 输出人类# 使用类方法创建实例p Person.from_string(小张-22)print(p.name) # 输出小张3. 静态方法定义使用staticmethod装饰器无默认参数self/cls。特点既不能访问实例属性也不能访问类属性功能上与普通函数类似但逻辑上归属于类仅用于封装与类相关的通用功能。python运行class MathUtil:# 静态方法staticmethoddef add(a, b):return a bstaticmethoddef multiply(a, b):return a * b# 调用静态方法print(MathUtil.add(2, 3)) # 输出5print(MathUtil.multiply(4,5))# 输出20三、类的属性详解属性分为实例属性和类属性作用域和使用方式差异显著。1. 实例属性定义在__init__方法中通过self.属性名定义。作用域仅属于当前实例每个实例的实例属性相互独立。访问只能通过实例访问实例.属性名。2. 类属性定义在类体内、方法外直接定义的变量。作用域所有实例共享类本身也可访问。修改类属性需通过类名操作实例无法直接修改类属性会生成同名实例属性。python运行class Student:# 类属性所有学生共享school 阳光中学def __init__(self, name, grade):# 实例属性每个学生独立self.name nameself.grade grade# 访问类属性print(Student.school) # 输出阳光中学print(Student(张三, 高一).school) # 实例也可访问# 修改类属性Student.school 星光中学print(Student.school) # 输出星光中学# 实例尝试修改类属性实际是创建实例属性不影响类属性s Student(李四, 高二)s.school 实验中学print(s.school) # 输出实验中学实例属性print(Student.school) # 输出星光中学类属性未变四、类的封装、继承与多态面向对象的三大特性是 Python 类的核心设计思想。1. 封装核心隐藏类的内部实现细节通过公共方法访问 / 修改私有属性保证数据安全。私有属性 / 方法在名称前加双下划线__仅能在类内部访问外部无法直接修改。提供公共方法get_xxx/set_xxx用于访问和修改私有属性。python运行class BankAccount:def __init__(self, balance):# 私有属性外部无法直接访问self.__balance balance# 公共方法获取余额def get_balance(self):return self.__balance# 公共方法存款增加数据校验def deposit(self, money):if money 0:self.__balance moneyelse:raise ValueError(存款金额必须大于0)# 公共方法取款def withdraw(self, money):if 0 money self.__balance:self.__balance - moneyelse:raise ValueError(取款金额无效或余额不足)# 封装后的使用account BankAccount(1000)# print(account.__balance) # 报错无法直接访问私有属性print(account.get_balance()) # 输出1000account.deposit(500)print(account.get_balance()) # 输出1500# account.withdraw(2000) # 报错余额不足2. 继承核心子类继承父类的属性和方法实现代码复用还可扩展或重写父类功能。单继承子类继承一个父类。多继承子类继承多个父类用逗号分隔Python 会按 MRO 规则解析方法调用顺序。子类重写父类方法直接定义同名方法覆盖父类逻辑。调用父类方法使用super()函数或父类名.方法名(self, 参数)。python运行# 父类class Animal:def __init__(self, name):self.name namedef make_sound(self):return 动物发出声音# 单继承Dog子类继承Animal父类class Dog(Animal):# 重写父类方法def make_sound(self):return f{self.name}汪汪叫# 扩展子类方法def run(self):return f{self.name}在奔跑# 多继承class Bird(Animal):def make_sound(self):return f{self.name}叽叽叫def fly(self):return f{self.name}在飞翔# 调用继承的方法dog Dog(大黄)print(dog.make_sound()) # 输出大黄汪汪叫print(dog.run()) # 输出大黄在奔跑bird Bird(小鸟)print(bird.make_sound()) # 输出小鸟叽叽叫3. 多态核心不同类的实例调用同名方法表现出不同的行为体现 “一个接口多种实现”。前提继承 方法重写。特点无需关心实例类型只需调用统一方法代码更灵活。python运行# 多态示例def animal_sound(animal):# 统一调用make_sound方法不同实例表现不同print(animal.make_sound())# 传入不同子类实例animal_sound(Dog(大黄)) # 输出大黄汪汪叫animal_sound(Bird(小鸟)) # 输出小鸟叽叽叫五、类的高级特性1. 装饰器与类Python 装饰器可用于类 / 类方法实现动态扩展类的功能如日志、计时、权限校验。python运行# 函数装饰器装饰类的方法def log_decorator(func):def wrapper(*args, **kwargs):print(f调用方法{func.__name__})result func(*args, **kwargs)print(f方法执行完成)return resultreturn wrapperclass Calculator:log_decoratordef add(self, a, b):return a b# 测试calc Calculator()calc.add(2, 3) # 输出调用方法add / 方法执行完成2. 魔术方法特殊方法类中以__xx__命名的方法为魔术方法会在特定场景自动调用用于实现类的特殊行为。表格魔术方法 触发场景 作用__init__ 创建实例时 初始化实例属性__str__ 打印实例 / 转换字符串时 定义实例的字符串表示__len__ 调用len(实例)时 定义实例的长度__del__ 实例被销毁时 实例销毁前的清理操作python运行class Book:def __init__(self, title, pages):self.title titleself.pages pages# 重写__str__定义打印实例的内容def __str__(self):return f《{self.title}》共{self.pages}页# 重写__len__定义实例的长度def __len__(self):return self.pages# 测试魔术方法book Book(Python编程, 300)print(book) # 输出《Python编程》共300页print(len(book)) # 输出3003. 动态属性与方法Python 是动态语言可在运行时为类 / 实例动态添加属性和方法。python运行class Student:def __init__(self, name):self.name name# 动态添加实例属性s Student(小明)s.grade 高三print(s.grade) # 输出高三# 动态添加实例方法需用types.MethodType绑定到实例import typesdef study(self):return f{self.name}正在学习s.study types.MethodType(study, s)print(s.study()) # 输出小明正在学习# 动态添加类方法classmethoddef get_class_info(cls):return 学生类封装学生信息Student.get_class_info get_class_infoprint(Student.get_class_info()) # 输出学生类封装学生信息六、实战案例完整的类应用结合前文知识点实现一个Circle圆类封装半径属性实现面积、周长计算并重写魔术方法。python运行import mathclass Circle:圆类封装半径属性计算面积和周长# 类属性PI math.pidef __init__(self, radius1):# 实例属性初始化半径默认值为1self.radius radius# 实例方法计算面积def calculate_area(self):area self.PI * (self.radius ** 2)return round(area, 2)# 实例方法计算周长def calculate_circumference(self):circumference 2 * self.PI * self.radiusreturn round(circumference, 2)# 重写__str__定义圆的字符串表示def __str__(self):return f圆半径{self.radius}# 重写__len__定义圆的“长度”为直径def __len__(self):return 2 * self.radius# 实战测试if __name__ __main__:# 创建实例circle Circle(5)# 访问属性print(f半径{circle.radius})# 调用方法print(f面积{circle.calculate_area()}) # 输出78.54print(f周长{circle.calculate_circumference()}) # 输出31.42# 魔术方法print(circle) # 输出圆半径5print(len(circle)) # 输出10七、总结Python 类是面向对象编程的核心掌握类的定义、属性、方法、三大特性及高级特性是写出高质量 Python 代码的基础。基础层面掌握类的定义、__init__构造方法、实例属性 / 方法的使用。进阶层面理解封装、继承、多态三大特性实现代码复用与扩展。高级层面掌握魔术方法、装饰器、动态属性等特性让类的设计更灵活、优雅。后续可结合实际业务场景如爬虫、数据分析、Web 开发进一步实践将类的知识落地到具体项目中。