在Python2.7中,使用 一个字符串作为它的参数,似乎将该字符串绑定到这两者 init的参数('self'和'grasshopper')。你知道吗
可以定义使用看似相同的 自我评价和自我评价结果蚱蜢. 你知道吗
我注意到,如果init被定义为接受三个参数,例如。, “self”、“grasshopper”和“beetle”——什么时候的班级 使用两个字符串参数(例如,CrazyString('spam','eggs')运行会引发错误:
TypeError: str() takes at most 1 argument (2 given)
这说明str不仅仅是遗传的 由类CrazyString执行,但作为函数执行。你知道吗
我不明白发生了什么,因此我感到 不确定我是否应该写方法来操作自己 或在蚱蜢. 或者是自我和蚱蜢事实上 相同的?你知道吗
class CrazyString(str):
def __init__(self, grasshopper):
self.grasshopper = grasshopper
def backwards1(self):
return self.grasshopper[::-1]
def backwards2(self):
return self[::-1]
if __name__ == "__main__":
cs = CrazyString('spam')
print cs
print cs.grasshopper
print cs.backwards1()
print cs.backwards2()
运行时('python疯狂.py,我得到以下输出:
spam
spam
maps
maps
在您的例子中,您在
__new__
函数上遇到了麻烦。你知道吗你应该这样做(未经测试!)你知道吗
这个答案有两部分:解释
str
初始化发生在哪里(因为您不调用str.__init__
),以及解释“在哪里str
存储字符串”。你知道吗首先,由于
str
是在C中实现的不可变类型,因此str.__init__
实际上并不参与初始化字符串。还有另一个方法__new__
,Python调用该方法在__init__
初始化类型之前创建类型的实例,对于像str
这样的不可变类型,__new__
创建预初始化的对象。(毕竟,如果__init__
初始化字符串,那将是一个变异。)第二,
self
似乎是一个字符串,因为它应该是一个字符串。您是从str
继承的,因此类的实例是str
的实例;它们是字符串!你可以print
像字符串一样对它们进行切片,像字符串一样对它们进行反转,因为它们继承了str
的所有内容。您不需要像人们有时所期望的那样,用self.str
之类的东西来“获取底层字符串”。你知道吗因此,字符串'spam'在作为第二个参数传递给
__init__
之前,由__new__
方法转换为'str'类型的对象。你知道吗如果有一个
__init__
具有除两个以外的任意数量的参数,那么调用CrazyString('spam')
将失败并以TypeError退出。这样做有效:相关问题 更多 >
编程相关推荐