前言
Python 是一种支持面向对象编程(OOP)的语言,其中类是核心概念。类是一种蓝图或模板,用于定义对象的属性和行为。本文将从零开始,详细介绍类的定义、使用,以及在实际编程中的应用
一、什么是类和对象?
类: 类是对象的模板,它定义了对象的属性(数据)和方法(行为)
对象: 对象是类的实例。通过类,可以创建多个具有相同属性和方法的对象
现实类比:
类是蓝图,比如“手机”是一个类
对象是基于蓝图创建的具体实例,比如“苹果手机”和“安卓手机”
二、如何定义类
使用 class
关键字定义一个类,类名通常遵循大写驼峰命名法(如 MyClass
)
2.1 类的基本结构
class ClassName:
"""类的文档字符串,用于描述类的用途(可选)"""
# 类属性
# 方法
2.2 示例:定义一个简单的类
class Person:
"""一个表示人的类"""
def greet(self):
"""打印问候语"""
print("你好,我是一个人!")
2.3 创建对象
对象是类的实例,使用类名加括号来创建对象
# 创建对象
p = Person()
# 调用方法
p.greet()
运行结果:
你好,我是一个人!
三、类的构造函数和属性
3.1 构造函数:__init__
方法
构造函数是类的特殊方法,用于在创建对象时初始化对象的属性
class Person:
def __init__(self, name, age):
"""构造函数"""
self.name = name # 定义实例属性
self.age = age
def greet(self):
print(f"你好,我叫 {self.name},今年 {self.age} 岁。")
3.2 创建对象并初始化属性
p = Person("小明", 20)
p.greet()
运行结果:
你好,我叫 小明,今年 20 岁。
四、类的属性和方法
4.1 类属性
类属性是所有对象共享的变量,定义在类级别
使用
ClassName.attribute
访问
class Person:
species = "人类" # 类属性
def __init__(self, name):
self.name = name # 实例属性
# 类属性访问
print(Person.species) # 输出 "人类"
# 实例属性访问
p = Person("小明")
print(p.name) # 输出 "小明"
4.2 实例属性
每个对象都有独立的实例属性
使用
self
引用实例属性
class Dog:
def __init__(self, name, breed):
self.name = name # 狗的名字
self.breed = breed # 狗的品种
# 创建实例
dog = Dog("小黑", "拉布拉多")
print(dog.name) # 输出 "小黑"
print(dog.breed) # 输出 "拉布拉多"
4.3 类方法和静态方法
类方法(@classmethod)
使用
@classmethod
装饰器定义。第一个参数是类本身(通常命名为
cls
)。
class Person:
species = "人类"
@classmethod
def describe(cls):
print(f"这是一个 {cls.species} 类。")
Person.describe() # 输出 "这是一个 人类 类。"
静态方法(@staticmethod)
使用
@staticmethod
装饰器定义不需要访问实例或类
class Math:
@staticmethod
def add(a, b):
return a + b
print(Math.add(5, 3)) # 输出 8
五、继承和多态
5.1 什么是继承?
继承是面向对象的重要特性,允许一个类(子类)从另一个类(父类)继承属性和方法
class Animal:
def speak(self):
print("动物在叫。")
# Dog 类继承 Animal
class Dog(Animal):
def speak(self):
print("汪汪!")
# 创建实例
dog = Dog()
dog.speak() # 输出 "汪汪!"
5.2 多态
多态指的是子类可以重写父类的方法,调用时会根据对象的实际类型执行对应的方法
class Cat(Animal):
def speak(self):
print("喵喵!")
animals = [Dog(), Cat()]
for animal in animals:
animal.speak()
运行结果:
汪汪!
喵喵!
六、封装
封装是面向对象编程中的重要概念,用于隐藏类的内部实现细节
6.1 私有属性和方法
在 Python 中,使用双下划线 __
开头定义私有属性或方法
class Person:
def __init__(self, name, age):
self.__name = name # 私有属性
self.__age = age
def __secret(self): # 私有方法
print("这是一个秘密!")
def show_info(self):
print(f"名字:{self.__name},年龄:{self.__age}")
self.__secret()
# 创建对象
p = Person("小明", 20)
p.show_info() # 正常访问
运行结果:
名字:小明,年龄:20
这是一个秘密!
七、特殊方法
Python 提供了一些特殊方法,用于实现内置操作
7.1 示例:重写 __str__
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"Person(name={self.name}, age={self.age})"
p = Person("小明", 20)
print(p) # 输出 "Person(name=小明, age=20)"
八、综合示例:学生管理系统
class Student:
"""学生类"""
def __init__(self, name, grade):
self.name = name
self.grade = grade
def show_info(self):
print(f"姓名:{self.name},成绩:{self.grade}")
class ClassRoom:
"""班级类"""
def __init__(self):
self.students = []
def add_student(self, student):
self.students.append(student)
def show_all(self):
for student in self.students:
student.show_info()
# 创建学生
s1 = Student("小明", 85)
s2 = Student("小红", 90)
# 创建班级并添加学生
classroom = ClassRoom()
classroom.add_student(s1)
classroom.add_student(s2)
# 展示所有学生信息
classroom.show_all()
运行结果:
姓名:小明,成绩:85
姓名:小红,成绩:90