鱼C论坛

 找回密码
 立即注册
查看: 2324|回复: 6

[已解决]求助

[复制链接]
发表于 2020-5-26 12:13:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 XD--Wrf 于 2020-5-26 12:14 编辑

#题目一 定义一个单词类继承字符串,重写比较操作符,当两个Word类对象进行比较时,根据单词的长度来进行比较大小
#加分要求 :实例化时如果传入的是带空格的字符串,则取第一个空格前的单词作为参数


class Word(str):
    def __le__(self, other):
        if  (self.find('')):
            self =self.split()[0]


        return str.__le__(len(self), len(other))


w1 = Word('i love')
w2 = Word('ilo')
print(w1 < w2)




我想问一问大佬们这么写小于等于会有什么问题出现吗?
我看小甲鱼44讲的课后练习答案中还需要重写__new__魔法方法
最佳答案
2020-5-26 13:11:41
你这样写也是可以的。
按照小甲鱼的答案,重载__new__方法之后,在创建该类的对象的时候,就把传入的参数字符串进行了处理,删掉了空格以及之后的内容,将之限定成一个单词了。
你的程序和小甲鱼的程序的区别就是在实例化对象时,若传入的字符串有空格,所创建的实例化对象是不一样的。
例如:同样的执行w1=Word('i love'),你的程序得到得到w1是字符串"i love",小甲鱼的答案得到的w1是"i"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-26 12:40:17 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-26 12:59 编辑

__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径

在定义子类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例

如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。

这题写小于等于没什么影响,因为对你传入的值没有发生改变,所以对这题来说,我个人认为这样写也可行吧

只是小甲鱼说重写不可变类型的,要加上__new__ 算是加分项目,但是如果你继承了不可变类型的想要改变你传入的值,那么必须要重写__new__
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 13:11:41 | 显示全部楼层    本楼为最佳答案   
你这样写也是可以的。
按照小甲鱼的答案,重载__new__方法之后,在创建该类的对象的时候,就把传入的参数字符串进行了处理,删掉了空格以及之后的内容,将之限定成一个单词了。
你的程序和小甲鱼的程序的区别就是在实例化对象时,若传入的字符串有空格,所创建的实例化对象是不一样的。
例如:同样的执行w1=Word('i love'),你的程序得到得到w1是字符串"i love",小甲鱼的答案得到的w1是"i"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 13:13:55 | 显示全部楼层
会出现问题,你给 str 的比较函数传了两个证书进去,直接报错。

怎么改看代码吧,加分要求也给你写上了
class Word(str):
    def __new__(cls,s=''):
        return str.__new__(cls,s.split()[0])
    def __le__(self,other):
        return self.__len__().__le__(other.__len__())
    def __lt__(self,other):
        return self.__len__().__lt__(other.__len__())
    def __gt__(self,other):
        return self.__len__().__gt__(other.__len__())
    def __ge__(self,other):
        return self.__len__().__ge__(other.__len__())
    def __eq__(self,other):
        return self.__len__().__eq__(other.__len__())
    def __ne__(self,other):
        return self.__len__().__ne__(other.__len__())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 15:49:43 | 显示全部楼层
sunrise085 发表于 2020-5-26 13:11
你这样写也是可以的。
按照小甲鱼的答案,重载__new__方法之后,在创建该类的对象的时候,就把传入的参数 ...

如果按照你所说的例子,应该打印出False,可是我的程序显示的是True,我写的这个不是也有按空格区分字符串的功能吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-26 16:46:03 | 显示全部楼层
XD--Wrf 发表于 2020-5-26 15:49
如果按照你所说的例子,应该打印出False,可是我的程序显示的是True,我写的这个不是也有按空格区分字符 ...


不是我说的例子,这是你自己给出了例子啊。
你试一下你的程序,print(w1)看看打印出来的是不是  i love
在3楼已经说了你的这种写法也是可行的。

和小甲鱼的区别是:
小甲鱼是在实例化对象的时候对字符串进行的处理,将输入的字符串处理的只剩下第一个单词
你的程序是在重载操作符的函数中对字符串进行的处理,

这两种方式都是可行的。
只不过你的程序写错了。
class Word(str):
    def __le__(self, other):
        self =self.split()[0] #不需要判断有没有空格,直接分割就可以,若没有的空格话,分割出来只有一部分而已
        other =other.split()[0] #这里other也要进行同样的操作
        return int.__le__(len(self), len(other))  #这里一个是用int的__le__函数


w1 = Word('i love')
w2 = Word('ilo')
print(w1 <= w2) #__le__是<=不是<
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-26 19:01:31 | 显示全部楼层
sunrise085 发表于 2020-5-26 16:46
不是我说的例子,这是你自己给出了例子啊。
你试一下你的程序,print(w1)看看打印出来的是不是  i lov ...

谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-11 17:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表