当类继承自一个像元组或者字符串这样不经常改变的类型的时候,我们可以用__new__
方法来实现自己的类,但是一直困扰我的一点是为什么我在__new__
里已经修改了传进来的参数,在__init__
中还是原来的值,现在我想明白了,__new__
传进来的参数最后变成了一个实例,而init里的参数是这个实例的一个属性,下面例子运行一下就很直观的显示出两者的不同。
# _*_ encoding:utf-8 _*_
class Word(str):
def __new__(cls, word):
# 注意,我们只能使用 __new__ ,因为str是不可变类型
# 所以我们必须提前初始化它(在实例创建时)
if ' ' in word:
print "Value contains spaces. Truncating to first space."
word = word[:word.index(' ')]
# Word现在包含第一个空格前的所有字母
return str.__new__(cls, word)#返回的是一个实例,这个word是实例的名称
def __init__(self,word):#而这个word是实例的一个属性,即(实例)word.word(属性)的值
self.word =word
temp = Word("1222 333")
print temp #输出1222
print(temp.word)#输出1222 333
https://zhuanlan.zhihu.com/p/26488074?refer=passer