# 🧱 类与对象题目(31~50) # 31. 定义一个学生类,包含姓名和成绩属性 这题怎么做,提示一下
ChatGPT 说:
好的燎然,这道题的提示思路如下:
思路提示
-
定义类
用class关键字定义一个类,比如Student。 -
添加属性
学生需要有姓名和成绩两个属性,可以在__init__方法里接收并保存。 -
创建对象
用类名加括号的方式创建对象,并传入姓名和成绩。
参考提示代码
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:这个方法是对象在用的,要接收对象自己。
🔑 总结
-
__init__给对象初始化属性,让每个对象有自己独立的数据。 -
魔术方法:双下划线包裹的方法,Python 在特定情况下自动调用。
-
self代表当前正在操作的那个对象。 -
没有
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() -
属性(变量)不能加
(),直接取值,比如name、score、result
✅ 改正后的写法
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) # ✅ 正确,不要加 ()