Python 定义一个学生类,包含姓名和成绩属性

71 阅读7分钟

# 🧱 类与对象题目(31~50) # 31. 定义一个学生类,包含姓名和成绩属性 这题怎么做,提示一下

ChatGPT 说:

好的燎然,这道题的提示思路如下:

思路提示

  1. 定义类
    class 关键字定义一个类,比如 Student

  2. 添加属性
    学生需要有姓名和成绩两个属性,可以在 __init__ 方法里接收并保存。

  3. 创建对象
    用类名加括号的方式创建对象,并传入姓名和成绩。

参考提示代码

class Student:
    def __init__(self, name, score):
        self.name = name      # 姓名属性
        self.score = score    # 成绩属性

# 创建一个学生对象
stu = Student("小明", 95)

# 打印属性
print(stu.name)   # 输出:小明
print(stu.score)  # 输出:95

⚡ 你可以先试着写出这个基本框架,然后我可以再带你加上方法(比如显示学生信息、修改成绩等)。

要不要我下一步帮你把**“打印学生信息的方法”**也加上去?

您说:

类的名称首字母都要大写吗, 定义函数的时候,我记得都是小写呀

ChatGPT 说:

你问得特别好 👍

Python 里确实有一套命名习惯(PEP8 规范),总结如下:

1. 类名(Class Name)

  • 推荐:首字母大写,并且每个单词首字母都大写(这种写法叫

    PascalCase

    CapWords

    )。

  • ✅ 例子:

    class Student:
        pass
    
    class MyProductManager:
        pass
    

这样写不是强制的,但属于“约定俗成”,别人一看到就知道这是个类。

2. 函数名 / 方法名(Function / Method Name)

  • 推荐:全小写,多个单词用下划线连接(snake_case)。

  • ✅ 例子:

    def get_score(self):
        return self.score
    
    def calculate_average(score_list):
        return sum(score_list) / len(score_list)
    

3. 变量名

  • 也是小写,多个单词用下划线。

  • ✅ 例子:

    student_name = "小明"
    total_score = 95
    

4. 常量

  • 全部大写,用下划线分隔。

  • ✅ 例子:

    PI = 3.14159
    MAX_SCORE = 100
    

🔑 总结一句话:

  • 类名 → 首字母大写(PascalCase)

  • 函数、变量 → 小写 + 下划线(snake_case)

  • 常量 → 全大写

这样写别人一眼就能分辨出是类、函数还是变量。

要不要我帮你把刚才写的 Student 类改成带有 方法命名规范 的完整版本,让你对比看看?

您说:

怎么 类class 里面还有 def, def 不是拿来定义函数的吗,难道 def _init_ 也是函数? 后面的参数里面怎么还有一个self ,这是什么东西

ChatGPT 说:

👌 燎然,你问的这几个点特别关键,理解了你就真正开始“入门面向对象”了。我们一点点拆开来说:

1. 类里面为什么还有 def

  • 在类 class 里面,def 还是用来定义函数的。

  • 不过在类里定义的函数,通常叫 方法(method)

  • 方法和普通函数的区别在于:
    👉 方法属于某个类,通常要通过对象来调用

举个例子:

class Student:
    def say_hello(self):   # 方法
        print("你好,我是学生!")

stu = Student()     # 创建一个对象
stu.say_hello()     # 通过对象调用方法

2. __init__ 是什么?

  • __init__ 叫做 构造方法 / 初始化方法

  • 当你创建对象时,__init__ 会自动运行,用来给对象的属性赋初值。

  • 它是 Python 内置的“魔术方法(magic method)”,前后都有两个下划线。

    class Student: def init(self, name, score): # 初始化方法 self.name = name self.score = score

    stu = Student("小明", 95) # 创建对象时 init 自动运行 print(stu.name) # 小明

所以,__init__ 也是函数,只不过是类里特别的函数

3. self 是什么?

  • self 代表当前对象本身

  • 当你用对象调用方法时,Python 会自动把这个对象传给方法的第一个参数

举例:

class Student:
    def __init__(self, name):
        self.name = name   # 给对象绑定属性

    def say_hello(self):   # 第一个参数必须写 self
        print(f"你好,我是{self.name}")

stu = Student("小明")  # 创建对象
stu.say_hello()        # 等价于 Student.say_hello(stu)

👉 你看,stu.say_hello() 背后其实是 Student.say_hello(stu)
所以 self 其实就是 stu 这个对象自己。

🔑 总结

  • 类里 def 定义的是方法(本质还是函数)。

  • __init__ 是一个特殊方法,在创建对象时自动调用,用来初始化对象。

  • self 代表对象本身,必须写在方法参数里第一个。

要不要我给你画个对象调用方法时的流程图,帮你把 stu.say_hello()Student.say_hello(stu) 的对应关系直观化?

您说:

当你创建对象时,__init__ 会自动运行,用来给对象的属性赋初值。--为什么要赋初值,每次外面创建实例的时候,都要赋初值吗,什么是magic method,前后有两个下划线的就是magic method 吗? 什么叫做当前对象本身,没有这个self 又会如何

ChatGPT 说:

燎然 👍,你现在问的这几个问题,都是理解面向对象的核心点。我来一一拆开说,帮你彻底理顺:

1. 为什么要赋初值?

当你创建一个对象时,这个对象里应该带有一些“自己的信息”(属性),否则它就是一张白纸,啥也没有。

比如:

  • 学生对象应该有姓名、成绩

  • 车对象应该有品牌、颜色、速度

  • 商品对象应该有名称、价格、库存

👉 __init__ 方法就是帮你在对象刚生成时,把这些“初始信息”写进去。

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

s1 = Student("小明", 95)  # 创建时赋值
s2 = Student("小红", 88)  # 每个对象有自己独立的数据

如果没有初值,所有对象都一样,没法区分。

当然,如果有的属性可以晚点再赋值,你也可以在 __init__ 里给它一个默认值。

class Student:
    def __init__(self, name, score=0):  # 默认成绩是0
        self.name = name
        self.score = score

2. 什么是 magic method(魔术方法)?

  • 在 Python 里,前后带双下划线的方法,都是“魔术方法” (magic method),属于系统自动调用的一类特殊方法。

  • __init__ 就是其中之一,它在对象创建时自动调用。

其他常见的魔术方法:

  • __str__ → 控制 print(对象) 的显示

  • __len__ → 控制 len(对象) 的返回值

  • __getitem__ → 控制 对象[index] 的行为

  • __add__ → 控制 对象1 + 对象2 的结果

👉 所以,双下划线 = 魔术方法。这些方法不需要你手动调用,Python 会在特定场景下自动触发。

3. 什么叫“当前对象本身”?

举个例子:

s1 = Student("小明", 95)
s2 = Student("小红", 88)
  • 当你调用 s1.say_hello() 时,self 代表的就是 s1 这个对象。

  • 当你调用 s2.say_hello() 时,self 代表的就是 s2 这个对象。

👉 self 就是“正在用的那个对象自己”。

4. 如果没有 self 会怎样?

来对比下:

❌ 错误示例:

class Student:
    def say_hello():
        print("你好")
        
s = Student()
s.say_hello()   # 会报错:缺少一个必须的参数

原因:
Python 在调用 s.say_hello() 时,自动把 s 作为第一个参数传进去
但你没写 self 来接这个参数,就报错了。

✅ 正确示例:

class Student:
    def say_hello(self):
        print("你好")

s = Student()
s.say_hello()   # ✅ 正常输出

👉 所以,self 不是关键字,但必须写。它告诉 Python:这个方法是对象在用的,要接收对象自己。

🔑 总结

  1. __init__ 给对象初始化属性,让每个对象有自己独立的数据。

  2. 魔术方法:双下划线包裹的方法,Python 在特定情况下自动调用。

  3. self 代表当前正在操作的那个对象

  4. 没有 self,对象方法就无法知道“是谁在调用”,会报错。

要不要我帮你写一段 演示多个魔术方法的例子(比如 __str____len__),让你看到“对象和内置函数互动”的效果?

您说:

在 Python 里,前后带双下划线的方法,都是“魔术方法” (magic method),属于系统自动调用的一类特殊方法。--明明是前后带单下划线,哪里来的双下划线

ChatGPT 说:

哈哈,燎然 👌,你观察得很仔细。这里容易搞混,我帮你彻底分清楚:

✅ Python 里常见的几种下划线写法

1. 前后双下划线

__init__ , __str__ , __len__
  • 前后各两个下划线 → 这才是 魔术方法(magic method)

  • 例如:

    • __init__ → 创建对象时自动调用

    • __str__print(obj) 时自动调用

    • __len__len(obj) 时自动调用

2. 前单下划线

_name
  • 代表“内部使用”,约定俗成的私有变量

  • Python 不会强制禁止外部访问,但表示“不要随便用”。

3. 前双下划线

__name
  • 触发 名称改写(name mangling),Python 会在内部把它改成 _类名__name,避免子类冲突。

  • 常用在类里,防止属性被子类意外覆盖。

4. 后双下划线

name__
  • 没有特殊含义,不建议随便写。

🔑 结论

  • 魔术方法 → 前后双下划线(例如 __init____str__

  • 不是“单下划线”!

我可以给你写个小 demo,让你亲自感受一下 魔术方法的“自动调用” 吗?比如 __str____len__

您说:

class Student: def __init__(self, name,score): self.name=name self.score=score if score>60: self.result="pass" else: self.result = "notpass" s1=Student("dana",70) print(s1.result())

ChatGPT 说:

燎然 👍,你这段代码基本没问题,就是最后一行写错了一点。

❌ 出错的地方

print(s1.result())

你写成了 s1.result(),但 result 是属性,不是方法

  • 方法(函数)要加 () 执行,比如 say_hello()

  • 属性(变量)不能加 (),直接取值,比如 namescoreresult

✅ 改正后的写法

class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score
        if score > 60:
            self.result = "pass"
        else:
            self.result = "notpass"

s1 = Student("dana", 70)
print(s1.result)   # ✅ 正确,不要加 ()