String的子类在被调用时,将参数绑定到\uuu init的两个参数\uuu?

2024-05-29 02:02:58 发布

您现在位置:Python中文网/ 问答频道 /正文

在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

Tags: 字符串self参数定义initdefspamcs
3条回答

在您的例子中,您在__new__函数上遇到了麻烦。你知道吗

你应该这样做(未经测试!)你知道吗

class CrazyString(str):

    def __new__(cls, grasshopper, beetle):
        return cls(grasshopper) # not sure if that works, maybe we have to use super() in any way...

    def __init__(self, grasshopper, beetle):
        self.grasshopper = grasshopper
        self.beetle = grasshopper

    def backwards1(self):
        return self.grasshopper[::-1]

    def backwards2(self):
        return self[::-1]

    def backwards3(self):
        return self.beetle[::-1]

if __name__ == "__main__":
    cs = CrazyString('spam')
    print cs
    print cs.grasshopper
    print cs.backwards1()
    print cs.backwards2()
    print cs.backwards3()

这个答案有两部分:解释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退出。这样做有效:

class CrazyString(str):
    def backwards(self):
        return self[::-1]

if __name__ == "__main__":
    cs = CrazyString('spam')
    print cs
    print cs.backwards()

相关问题 更多 >

    热门问题