为什么初始化方法def __init__(self,category,gender,age)中不存在speed参数,但是在代码块中出现了self.speed=0?

问题描述:

fo=open("PY301-1.txt","w")
class Horse():
    def __init__(self,category,gender,age):
        self.category=category
        self.gender = gender
        self.age=age
        self.speed=0
    def get_descriptive(self):
        self.info="一匹"+self.category+str(self.age)+"岁的"+self.gender+"马"
    def write_speed(self,new_speed):
        self.speed=new_speed
        addr="在草原上奔跑的速度为"
        fo.write(self.info+","+addr+str(self.speed)+"km/h。")
horse=Horse("阿拉伯","公",12)
horse.get_descriptive()
horse.write_speed(50)
fo.close()


为什么初始化方法def __init__(self,category,gender,age)中不存在speed参数,但是在代码块中出现了self.speed=0?初始化方法def __init__(self,category,gender,age)中不存在speed参数可以先不写,然后在初始化模块中可以临时用self.speed=0给出吗?

为什么category,gender,age这三个参数都是self.本身=本身,而speed是等于了一个常量0,speed相对于其他三个参数有什么特殊之处?为什么行为方法def write_speed(self,new_speed)里面出现了新的参数new_speed,请问这个new_spped可以改变初始化属性代码块中的speed吗?

在进行对象实例化时,horse=Horse("阿拉伯","公",12),只传入了3个参数,分别对应category,gender,age,说明category,gender,age这三个参数是默认参数,而speed是默认参数(非必选参数),默认参数可以不出现def __init__(self, category, gender, age)里面的括号中,而直接在def __init__(self, category, gender, age)的代码块中,这句话解析的正确吗?

问题解答:

逐步解析这些问题:

1. 为什么 __init__ 方法中没有 speed 参数,但可以在代码中出现 self.speed=0

在 Python 的类中,初始化方法 (__init__) 用于设置对象的初始状态。虽然 __init__ 方法的参数列表中没有 speed,你仍然可以在 __init__ 方法内部定义它,并赋予初始值。这种做法是完全合法的,并且常见于需要为某些属性设置默认值的情况。

class Horse:
    def __init__(self, category, gender, age):
        self.category = category
        self.gender = gender
        self.age = age
        self.speed = 0  # 设置默认速度为0

2. 为什么 category, gender, age 是通过参数传入,而 speed 是直接赋值为常量 0?

  • category, gender, age 这三个属性是通过 __init__ 方法的参数传入的,因为它们的值需要在创建对象时由用户提供。
  • speed 直接赋值为常量 0,是因为它有一个合理的默认值,不需要在对象创建时由用户提供。如果用户需要在对象创建时设置 speed,则可以在 __init__ 方法的参数列表中包含 speed

3. write_speed 方法中的 new_speed 参数可以改变 __init__ 方法中的 speed 吗?

是的,write_speed 方法中的 new_speed 参数会改变 __init__ 方法中定义的 speed 属性。这是通过 self.speed = new_speed 实现的。

def write_speed(self, new_speed):
    self.speed = new_speed  # 更新速度
    addr = "在草原上奔跑的速度为"
    fo.write(self.info + "," + addr + str(self.speed) + "km/h。")

4. 对象实例化时只传入了3个参数,说明 category, gender, age 是必选参数,而 speed 是默认参数,这句话解析正确吗?

部分正确。更准确地说,category, gender, age 是初始化对象时必须提供的参数,而 speed 是一个在初始化方法内部定义并赋予默认值的属性。它并不是默认参数,而是一个在 __init__ 方法中直接赋值的属性。

完整解析

  • category, gender, age 是必选参数,必须在创建对象时由用户提供。
  • speed 不是通过参数传入的,而是在 __init__ 方法内部直接赋值的,因此它有一个默认值 0。这样的属性可以不出现在 __init__ 方法的参数列表中,而是直接在 __init__ 方法的代码块中定义。

改进后的代码示例

# 打开文件准备写入
fo = open("PY301-1.txt", "w")

class Horse:
    def __init__(self, category, gender, age):
        self.category = category  # 初始化类别
        self.gender = gender      # 初始化性别
        self.age = age            # 初始化年龄
        self.speed = 0            # 初始化速度为0
    
    def get_descriptive(self):
        # 获取描述性信息
        self.info = "一匹" + self.category + str(self.age) + "岁的" + self.gender + "马"
    
    def write_speed(self, new_speed):
        # 更新速度并写入文件
        self.speed = new_speed
        addr = "在草原上奔跑的速度为"
        fo.write(self.info + "," + addr + str(self.speed) + "km/h。")

# 创建马的实例
horse = Horse("阿拉伯", "公", 12)
horse.get_descriptive()  # 生成描述信息
horse.write_speed(50)    # 更新速度并写入文件

# 关闭文件
fo.close()

总结

  • __init__ 方法中的 speed 属性是直接在方法体内赋值的,不需要作为参数传入。
  • 其他属性如 category, gender, age 是初始化对象时必须提供的参数。
  • 实例方法可以通过参数更新对象的属性,这样的设计提高了对象的灵活性和可用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神笔馬良

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值