007
1
fo = open("PY301-1.txt","w")
_____ Horse():
def _____(self, category, gender, age):
...
def get_descriptive(self):
_____.info = "一匹" + _____ + _____ + "岁的" + _____ + "马"
def write_speed(self, new_speed):
_____
addr = "在草原上奔跑的速度为"
fo.write(_____ + "," + addr + str(self.speed) + "km/h。")
...
fo.close()
我的答案:
fo = open("PY301-1.txt","w")
class Horse():
def __init__(self, category, gender, age):
self.catagory = category
self.gender = gender
self.age = age
def get_descriptive(self):
# 不能是 str(age) 因为是
self.info = "一匹" + str(self.category) + str(self.age) + "岁的" + str(self.gender) + "马"
def write_speed(self, new_speed):
self.speed = speed
addr = "在草原上奔跑的速度为"
fo.write(self.info + "," + addr + str(self.speed) + "km/h。")
catagory = "阿拉伯"
age = '12'
gender = '公'
speed = '50'
fo.close()
错因:
- 调用类的方法的时候,类似于调用函数,因此,不能像这样设置属性:
catagory = "阿拉伯"
age = '12'
gender = '公'
speed = '50'
- 其次:学会善用
str()
,这样对于字符串的拼接有很大的帮助。并且可以改变变量的内容,实现变量的一改全改。
复盘:12点48分 2021年4月8日
fo = open("PY301-1.txt","w")
class Horse():
def __init__(self, category, gender, age):
self.category = category
self.gender = gender
self.age = age
def get_descriptive(self):
self.info = "一匹" + str(self.category) + str(self.age) + "岁的" + str(self.gender) + "马"
def write_speed(self, new_speed):
self.speed = speed
addr = "在草原上奔跑的速度为"
fo.write(self.info + "," + addr + str(self.speed) + "km/h。")
Horse("阿拉伯", '12', '公')
get_descriptive()
write_speed("50")
fo.close()
- 这里报错了,说
get_descriptive
没有定义,一定是调用类的属性的时候存在问题。
分析答案:
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()
- 自我理解:
- 首先答案的准确在于:马本来就有一定的速度,这里答案采用了假设法,假设马的初速度是0,这也符合常理。
- 其次,和答案不同在于:答案仅对数字类型的参数采用了
str()
方法,而其他的参数没有采用,因为在赋值的过程中可以使用字符串类型的参数。 - 在写速度的函数中(准确的应该是对马这个类的行为(操作)的定义),解题关键在于,后面的
write()
中有self.speed
,因此可以作为对前面一空的提示,而不是写成:self.new_speed = new_speed
- 在调用类的方法过程中,需要创建实例。这里以
horse
作为实例,用于存储调用语句。horse = Horse("阿拉伯","公",12)
注意细节:实例一般是小写,而python
对大小写敏感,因此不能写成horse = horse("阿拉伯","公",12)
;另外,除了年龄是数字类型,其他的都为字符串类型,如果没有引号括起来,将会造成xxx is not defined
的错误。 - 然后如果是调用类中的方法,
.
作为操作符,常常用于调用,e.g. list.append()
:这里就是调用列表的append()
方法。同理,horse.get_descriptive()
就是调用Horse
的get_descriptive
方法。horse.write_speed(50)
就是调用Horse
的write_speed
方法,并设速度为 50(整型
)。
- 注意事项:
- 一定要注意参数的传入顺序,否则会闹笑话。
- 另外,唯有字符串才可以拼接,字符串和数字是不可以拼接的。
一匹公12岁的阿拉伯马,在草原上奔跑的速度为50km/h。
- 这里显然和题目要求的不符合
一匹阿拉伯12岁的公马,在草原上奔跑的速度为50km/h。
- 这样才是对的
2
fo = open("PY301-2.txt","w")
_____ Horse():
def _____(self, category, gender, age):
...
def get_descriptive(self):
_____.info = "一匹" + _____ + _____ + "岁的" + _____ + "马"
def write_speed(self, new_speed):
_____
addr = "在草原上奔跑的速度为"
fo.write(_____ + "," + addr + str(self.speed) + "km/h。")
class Camel(Horse):
def __init__(self, category, gender, age):
_____.__init__(category, gender, age)
def write_speed(self,new_speed):
_____
addr = "在沙漠上奔跑的速度为"
fo.write(self.info.replace(_____) + "," + addr + str(self.speed) + "km/h。")
...
fo.close()
我的答案:
fo = open("PY301-2.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。")
class Camel(Horse):
def __init__(self, category, gender, age):
Horse.__init__(category, gender, age)
def write_speed(self,new_speed):
self.speed = new_speed
addr = "在沙漠上奔跑的速度为"
fo.write(self.info.replace('马','骆驼') + "," + addr + str(self.speed) + "km/h。")
horse = Horse("双驼峰",'母',20)
horse.get_descriptive()
horse.write_speed(40)
fo.close()
result:
- 这里的错误在于,没有将马替换为骆驼,一定是对 对象不够深入的理解。
- 原因在于:一是对调用类的方法的不准确,题目要求的是对骆驼的描述,而我写的还是对马类的调用方法,因此错了。二是对
super()
函数的vacant
。
因此修改我的答案:
fo = open("PY301-2.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。")
class Camel(Horse):
def __init__(self, category, gender, age):
super().__init__(category, gender, age)
def write_speed(self,new_speed):
self.speed = new_speed
addr = "在沙漠上奔跑的速度为"
fo.write(self.info.replace('马','骆驼') + "," + addr + str(self.speed) + "km/h。")
camel = Camel("双驼峰",'母',20)
camel.get_descriptive()
camel.write_speed(40)
fo.close()
知识面的扩充:
内置函数(类)super,Python 官方文档描述如下:
返回一个代理对象,它会将方法调用委托给类 type 的父类或兄弟类。这对于访问已在类中被重载的继承方法很有用。
class A:
def add(self, x):
y = x + x
print(y)
class B(A):
def add(self, x):
super().add(x)
b = B()
b.add(5)
实例代码分析:
- 创建一个
A
类,其方法就是对x
求和,并将结果存储在变量y
中,输出y
的结果。
class A:
def add(self, x):
y = x + x
print(y)
- 这里是继承
A
类的方法,super()
的意思,个人认为就是是一种命令牌,有了它就可以调用A
类的方法。
class B(A):
def add(self, x):
super().add(x)
如果删除super()
:
<ipython-input-2-336bb71b8077> in add(self, x)
6 class B(A):
7 def add(self, x):
----> 8 add(x)
9
10 b = B()
NameError: name 'add' is not defined
- 程序会报错,原因就是B类尽管继承了A类的方法,但是没有调用A类方法的权限,所以显示的是
add
未定义。
- 这里的调用语句:第一句的意思就是,创建了一个
B
的实例b
b
从此之后就是一个根据B
这个Class
创建的Instance
,对使用者来说,它就是个Object
;- 由于
B
类使用了super()
,故继承了A
类的方法,传入参数5
,实际上是调用了A
类的方法,5+5 = 10
,故打印10
b = B()
b.add(5)