Python面向对象:class定义类与创建实例对象

一、开篇:class——创建自定义类型的蓝图
在Python中,一切皆对象——整数是int类的实例,字符串是str类的实例,列表是list类的实例。class关键字让你创建自己的类型。这就像从使用内置工具进化到自己制造工具。
⌨️ 最基本的class:
# 定义一个类
class Person:
"""人类——最简单的类定义"""
pass # 空类,什么都没有
# 创建实例(对象)
p1 = Person()
p2 = Person()
print(type(p1)) # <class '__main__.Person'>
print(isinstance(p1, Person)) # True
print(p1 is p2) # False —— 两个不同的实例
二、class的基本语法
2.1 类定义和命名规范
# 类名使用PascalCase(大驼峰)——PEP 8规范
# ✅ 好的命名
class Student:
pass
class BankAccount:
pass
class HttpRequestHandler:
pass
# ❌ 不好的命名
# class student: # 应该大写开头
# class bank_account: # 应该用驼峰
# class HTTP_Request: # 缩写保持大写,但下划线不必要
# 类的文档字符串
class Point:
"""二维空间中的一个点。
表示平面直角坐标系中的一个位置。
Attributes:
x: 横坐标
y: 纵坐标
"""
pass
# 类的文档字符串可以通过__doc__访问
print(Point.__doc__)
2.2 添加属性和方法
# 最简单的带属性和方法的类
class Dog:
"""狗——带属性和方法"""
# 类属性——所有实例共享
species = "犬科动物"
# 初始化方法——创建实例时自动调用
def __init__(self, name, age):
self.name = name # 实例属性
self.age = age # 实例属性
# 实例方法——操作实例数据
def bark(self):
return f"{self.name}说: 汪汪!"
def celebrate_birthday(self):
"""过生日——年龄+1"""
self.age += 1
return f"{self.name}现在{self.age}岁了!"
# 创建实例
dog1 = Dog("旺财", 3)
dog2 = Dog("小黑", 1)
# 访问属性和方法
print(dog1.name) # 旺财
print(dog1.bark()) # 旺财说: 汪汪!
print(dog1.species) # 犬科动物 —— 类属性,所有实例共享
print(dog2.species) # 犬科动物 —— 同样的值
# 各自独立的状态
print(dog1.celebrate_birthday()) # 旺财现在4岁了!
print(dog2.age) # 1 ——不变的
2.3 类也是对象
# Python中一切皆对象——类本身也是对象(type的实例)
class MyClass:
"""一个简单的类"""
pass
# 类是一个type对象
print(type(MyClass)) # <class 'type'>
print(type(MyClass())) # <class '__main__.MyClass'>
# 类可以被赋值给变量
Alias = MyClass
obj = Alias() # 等价于 MyClass()
print(type(obj)) # <class '__main__.MyClass'>
# 类可以作为参数传递
def describe_class(cls):
return f"类名: {cls.__name__}, 文档: {cls.__doc__}"
print(describe_class(MyClass))
# 类可以动态创建(元编程)
# type(name, bases, dict) —— 动态创建类
DynamicClass = type("DynamicClass", (), {"x": 10, "hello": lambda self: "Hello!"})
obj = DynamicClass()
print(obj.x) # 10
print(obj.hello()) # Hello!
三、实例的创建过程
3.1 init__和__new
# Python创建实例分两步:
# 1. __new__() —— 创建对象(分配内存)——很少需要重写
# 2. __init__() —— 初始化对象(设置属性)——最常用
class Demo:
"""演示实例创建过程"""
def __new__(cls, *args, **kwargs):
"""创建实例——在__init__之前调用"""
print(f"1. __new__ 被调用, cls={cls.__name__}")
instance = super().__new__(cls) # 调用object的__new__
print(f" 创建了实例: {instance}")
return instance
def __init__(self, name):
"""初始化实例——在__new__之后调用"""
print(f"2. __init__ 被调用, self={self}")
self.name = name
print(f" 设置了 name={self.name}")
# 创建实例
demo = Demo("测试")
# 输出:
# 1. __new__ 被调用, cls=Demo
# 创建了实例: <__main__.Demo object at …>
# 2. __init__ 被调用, self=<__main__.Demo object at …>
# 设置了 name=测试
# 💡 99%的情况下你只需要__init__
# __new__主要用于不可变类型的子类(str, int, tuple)和单例模式
3.2 动态属性
# Python允许在运行时给实例添加属性
# 但这不推荐——破坏了一致性
class Student:
def __init__(self, name):
self.name = name
s = Student("张三")
s.age = 20 # 动态添加属性——可以但不推荐
s.email = "zs@test.com"
# __dict__属性——查看实例的所有自定义属性
print(s.__dict__)
# {'name': '张三', 'age': 20, 'email': 'zs@test.com'}
# __slots__可以限制实例的属性(后面文章会讲)
四、实战案例
4.1 学生管理系统
class Student:
"""学生类"""
school = "第一中学" # 类属性——所有学生共享
def __init__(self, student_id, name, grade):
self.student_id = student_id
self.name = name
self.grade = grade
self.scores = {} # 科目→分数
def add_score(self, subject, score):
"""添加或更新成绩"""
if not 0 <= score <= 100:
raise ValueError("分数必须在0-100之间")
self.scores[subject] = score
return f"{self.name}的{subject}成绩已更新为{score}分"
def get_average(self):
"""计算平均分"""
if not self.scores:
return 0
return sum(self.scores.values()) / len(self.scores)
def get_report(self):
"""生成成绩报告"""
lines = [f"学生: {self.name} (学号: {self.student_id})"]
lines.append(f"学校: {self.school}")
lines.append(f"年级: {self.grade}")
lines.append("-" * 30)
for subject, score in self.scores.items():
grade = "优秀" if score >= 90 else "良好" if score >= 80 else \\
"中等" if score >= 70 else "及格" if score >= 60 else "不及格"
lines.append(f" {subject}: {score}分 ({grade})")
lines.append(f" 平均分: {self.get_average():.1f}")
return "\\n".join(lines)
# 使用
s1 = Student("S001", "张三", "九年级")
s1.add_score("语文", 88)
s1.add_score("数学", 92)
s1.add_score("英语", 85)
print(s1.get_report())
五、总结
class是创建自定义类型的蓝图。理解类和实例的关系——类是模板,实例是具体的产品——是OOP的起点。
💡 核心要点:
✅ 一个.py文件通常包含一个主要的类和几个辅助类。类是组织代码的容器。




