欢迎光临
我们一直在努力

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

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的起点。

💡 核心要点:

  • 类名用PascalCase命名
  • **__init__**初始化实例属性
  • 实例属性各自独立,类属性所有实例共享
  • 类本身也是对象——type的实例
  • ✅ 一个.py文件通常包含一个主要的类和几个辅助类。类是组织代码的容器。

    赞(0)
    未经允许不得转载:171主机测评 » Python面向对象:class定义类与创建实例对象
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址