题缘有你007——通过创建python类实现对文本的处理

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()
  • 自我理解:
  1. 首先答案的准确在于:马本来就有一定的速度,这里答案采用了假设法,假设马的初速度是0,这也符合常理。
  2. 其次,和答案不同在于:答案仅对数字类型的参数采用了 str() 方法,而其他的参数没有采用,因为在赋值的过程中可以使用字符串类型的参数。
  3. 在写速度的函数中(准确的应该是对马这个类的行为(操作)的定义),解题关键在于,后面的 write() 中有self.speed ,因此可以作为对前面一空的提示,而不是写成:self.new_speed = new_speed
  4. 在调用类的方法过程中,需要创建实例。这里以horse 作为实例,用于存储调用语句。horse = Horse("阿拉伯","公",12) 注意细节:实例一般是小写,而 python 对大小写敏感,因此不能写成horse = horse("阿拉伯","公",12);另外,除了年龄是数字类型,其他的都为字符串类型,如果没有引号括起来,将会造成 xxx is not defined 的错误。
  5. 然后如果是调用类中的方法,. 作为操作符,常常用于调用,e.g. list.append():这里就是调用列表的 append() 方法。同理,horse.get_descriptive() 就是调用 Horseget_descriptive 方法。horse.write_speed(50) 就是调用 Horsewrite_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)

实例代码分析:

  1. 创建一个 A 类,其方法就是对 x 求和,并将结果存储在变量 y 中,输出 y 的结果。
class A:
    def add(self, x):
        y = x + x
        print(y)
  1. 这里是继承 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 未定义。
  1. 这里的调用语句:第一句的意思就是,创建了一个 B 的实例 b
  • b 从此之后就是一个根据 B 这个 Class 创建的 Instance,对使用者来说,它就是个 Object
  • 由于 B 类使用了 super() ,故继承了 A 类的方法,传入参数 5 ,实际上是调用了 A 类的方法,5+5 = 10,故打印 10
b = B()
b.add(5)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

奋斗的_小白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值