求助
本帖最后由 XD--Wrf 于 2020-5-26 12:14 编辑#题目一 定义一个单词类继承字符串,重写比较操作符,当两个Word类对象进行比较时,根据单词的长度来进行比较大小
#加分要求 :实例化时如果传入的是带空格的字符串,则取第一个空格前的单词作为参数
class Word(str):
def __le__(self, other):
if(self.find('')):
self =self.split()
return str.__le__(len(self), len(other))
w1 = Word('i love')
w2 = Word('ilo')
print(w1 < w2)
我想问一问大佬们这么写小于等于会有什么问题出现吗?
我看小甲鱼44讲的课后练习答案中还需要重写__new__魔法方法 本帖最后由 Twilight6 于 2020-5-26 12:59 编辑
__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径
在定义子类时没有重新定义__new__()时,Python默认是调用该类的直接父类的__new__()方法来构造该类的实例
如果该类的父类也没有重写__new__(),那么将一直按此规矩追溯至object的__new__()方法,因为object是所有新式类的基类。
这题写小于等于没什么影响,因为对你传入的值没有发生改变,所以对这题来说,我个人认为这样写也可行吧
只是小甲鱼说重写不可变类型的,要加上__new__ 算是加分项目,但是如果你继承了不可变类型的想要改变你传入的值,那么必须要重写__new__
你这样写也是可以的。
按照小甲鱼的答案,重载__new__方法之后,在创建该类的对象的时候,就把传入的参数字符串进行了处理,删掉了空格以及之后的内容,将之限定成一个单词了。
你的程序和小甲鱼的程序的区别就是在实例化对象时,若传入的字符串有空格,所创建的实例化对象是不一样的。
例如:同样的执行w1=Word('i love'),你的程序得到得到w1是字符串"i love",小甲鱼的答案得到的w1是"i"
会出现问题,你给 str 的比较函数传了两个证书进去,直接报错。
怎么改看代码吧,加分要求也给你写上了class Word(str):
def __new__(cls,s=''):
return str.__new__(cls,s.split())
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__()) sunrise085 发表于 2020-5-26 13:11
你这样写也是可以的。
按照小甲鱼的答案,重载__new__方法之后,在创建该类的对象的时候,就把传入的参数 ...
如果按照你所说的例子,应该打印出False,可是我的程序显示的是True,我写的这个不是也有按空格区分字符串的功能吗 XD--Wrf 发表于 2020-5-26 15:49
如果按照你所说的例子,应该打印出False,可是我的程序显示的是True,我写的这个不是也有按空格区分字符 ...
不是我说的例子,这是你自己给出了例子啊。
你试一下你的程序,print(w1)看看打印出来的是不是i love
在3楼已经说了你的这种写法也是可行的。
和小甲鱼的区别是:
小甲鱼是在实例化对象的时候对字符串进行的处理,将输入的字符串处理的只剩下第一个单词
你的程序是在重载操作符的函数中对字符串进行的处理,
这两种方式都是可行的。
只不过你的程序写错了。
class Word(str):
def __le__(self, other):
self =self.split() #不需要判断有没有空格,直接分割就可以,若没有的空格话,分割出来只有一部分而已
other =other.split() #这里other也要进行同样的操作
return int.__le__(len(self), len(other))#这里一个是用int的__le__函数
w1 = Word('i love')
w2 = Word('ilo')
print(w1 <= w2) #__le__是<=不是< sunrise085 发表于 2020-5-26 16:46
不是我说的例子,这是你自己给出了例子啊。
你试一下你的程序,print(w1)看看打印出来的是不是i lov ...
谢谢大佬
页:
[1]