|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
题目:定义一个单词(Word)类继承自字符串,重写比较操作符(参考自学:Python 魔法方法详解),当两个 Word 类对象进行比较时,根据单词的长度来进行比较大小。
我的做法用了__init__方法来初始化,也能够实现。但是答案中说,必须要用到__new__方法。那么,我这么做会出现什么问题?
我的做法:
class Word(str):
def __init__(self, x):
#如果输入的是空格,就报错
#如果去掉收尾两端的空格之后,字符串内部有空格的情况
#然后就是其他
if x == ' ':
print('输入错误,不能为空格')
elif ' ' in x.strip():
self.x = x.strip().split()[0]
self.length = len(self.x)
else:
self.x = x
self.length = len(self.x)
def __lt__(self, other):
return self.length < other.length
def __le__(self, other):
return self.length <= other.length
def __eq__(self, other):
return self.length == other.length
def __ne__(self, other):
return self.length != other.length
def __gt__(self, other):
return self.length > other.length
def __ge__(self, other):
return self.length >= other.length
小甲鱼老师给的答案:
class Word(str):
'''存储单词的类,定义比较单词的几种方法'''
def __new__(cls, word):
# 注意我们必须要用到 __new__ 方法,因为 str 是不可变类型
# 所以我们必须在创建的时候将它初始化
if ' ' in word:
print "Value contains spaces. Truncating to first space."
word = word[:word.index(' ')] #单词是第一个空格之前的所有字符
return str.__new__(cls, word)
def __gt__(self, other):
return len(self) > len(other)
def __lt__(self, other):
return len(self) < len(other)
def __ge__(self, other):
return len(self) >= len(other)
def __le__(self, other):
return len(self) <= len(other)
你的代码直接重新了__init__
并没有用到super(),如果你用super()来继承str原来的__init__就会报错
而如果你重写__new__
用super()继承你父类原本的__new__就不会报错
|
|