问题描述:
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
是初始化对象时必须提供的参数。 - 实例方法可以通过参数更新对象的属性,这样的设计提高了对象的灵活性和可用性。