Python类方法参数与类属性同名问题及Tribute类扩展任务咨询
解答:扩展Tribute类 + 方法参数与类属性同名疑问
嘿,咱们一步步来搞定你的Python类作业,还有那个方法参数和类属性同名的疑问~
一、完成Tribute类的扩展实现
先直接给你满足所有要求的代码实现,再逐点解释:
class Tribute: def __init__(self): # 新增hunger属性,初始值设为0(初始饱腹状态) self.hunger = 0 def get_hunger(self): # 返回当前的饥饿值 return self.hunger def add_hunger(self, hunger): # 将传入的饥饿值累加到实例的hunger属性中 self.hunger += hunger
对应你的三个任务点:
- 任务a:在
__init__初始化方法里,给每个Tribute实例都设置了self.hunger = 0,完美符合初始饱腹的要求; - 任务b:
get_hunger()方法直接返回实例当前的hunger属性值,实现了获取饥饿值的功能; - 任务c:
add_hunger(hunger)方法通过self.hunger += hunger把传入的饥饿值累加进去,逻辑清晰直接。
二、关于Python类方法参数与类属性同名的疑问
这绝对是新手刚接触类时最容易踩的坑之一,我给你讲明白:
当方法的参数名和实例的属性名重名时,Python会优先识别方法内部的局部参数,而不是实例的属性。举个错误的例子你就懂了:
class Tribute: def __init__(self): self.hunger = 0 def wrong_add_hunger(self, hunger): # 这里的hunger是方法的局部参数,不是实例的self.hunger! hunger += 5 print(f"局部参数hunger现在是: {hunger}") print(f"实例的hunger属性还是: {self.hunger}") t = Tribute() t.wrong_add_hunger(3) # 输出结果: # 局部参数hunger现在是: 8 # 实例的hunger属性还是: 0
看到没?这里修改的只是方法里的局部参数,完全碰不到实例的hunger属性——因为它们是两个独立的变量,只是名字一样罢了。
所以区分它们的核心规则就是:
- 如果你要操作实例的属性,必须加上
self.前缀(比如self.hunger); - 如果你要使用方法的局部参数,直接写参数名就行(比如
hunger)。
回到咱们作业里的add_hunger方法,self.hunger += hunger这句话里,左边的self.hunger是实例的属性,右边的hunger是传入的参数,Python能准确区分两者,完全不会混淆。
内容的提问来源于stack exchange,提问作者Prashin Jeevaganth
相关产品推荐
相关产品推荐

