Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将我自己的方法添加到内置str类型?_Python_String_Class_Methods - Fatal编程技术网

Python 如何将我自己的方法添加到内置str类型?

Python 如何将我自己的方法添加到内置str类型?,python,string,class,methods,Python,String,Class,Methods,此函数可以将字符串中的所有偶数字符提取到新字符串中: def change(s): result="" for index,item in enumerate(s): if(index%2 !=0): result=result+item return(result) 我怎样才能使它成为str类上的一个方法?当您在Python控制台中输入x.change()时,我将得到与change(x)相同的输出x.change()将获得'al-ol' dir(x)将

此函数可以将字符串中的所有偶数字符提取到新字符串中:

def change(s):
    result=""
    for index,item in enumerate(s):
        if(index%2 !=0): result=result+item
    return(result)
  • 我怎样才能使它成为
    str
    类上的一个方法?当您在Python控制台中输入
    x.change()
    时,我将得到与
    change(x)
    相同的输出
    x.change()
    将获得
    'al-ol'

  • dir(x)
    将在输出中获得
    'change'
    ,例如:

    >>> x="hallo world"
    >>> change(x)
    'al ol'
    

  • 你不能这样做。嗯,至少不是直接的。Python不允许向内置类型添加自定义方法/属性。这只是语言的法则

    但是,您可以通过(继承自)
    str
    ,创建自己的字符串类型:

    ['__add__', '__class__', ...omitted..., 'zfill', 'change'] 
    
    >>> class MyStr(str):
    ...     def change(self):
    ...         result=""
    ...         for index,item in enumerate(self):
    ...             if(index%2 !=0): result=result+item
    ...         return(result)
    ...
    >>> x = MyStr("hallo world")
    >>> x
    'hallo world'
    >>> x.change()
    'al ol'
    >>> 'change' in dir(x)
    True
    >>>
    
    演示:

    新的
    MyStr
    类在各个方面都将像普通的
    str
    类一样工作。事实上,它具有
    str
    上的所有功能:

    ['__add__', '__class__', ...omitted..., 'zfill', 'change'] 
    
    >>> class MyStr(str):
    ...     def change(self):
    ...         result=""
    ...         for index,item in enumerate(self):
    ...             if(index%2 !=0): result=result+item
    ...         return(result)
    ...
    >>> x = MyStr("hallo world")
    >>> x
    'hallo world'
    >>> x.change()
    'al ol'
    >>> 'change' in dir(x)
    True
    >>>
    

    这两者之间的唯一区别是
    MyStr
    添加了一个
    change
    方法。

    不确定,但您可以创建自己的模块,使用不同于sting的名称,并将其保存在
    /usr/lib/python2.7/
    或lib目录中。我将它们称为字符串中的奇数字符,因为Python使用基于0的索引。另外,我意识到这只是一个自定义方法的示例,但是FWIW您可以像您的
    change()
    方法那样使用切片:
    “hallo world”[1::2]->“al ol”
    ,为澄清起见,创建的任何字符串文字永远不会是MyStr的实例。str类创建的任何字符串文字都将是str的实例,永远不会是MyStr的实例。>>>x1=str(“haha1”)>>>isinstance(x1,str)True>>>isinstance(x1,MyStr)False任何由MyStr类创建的字符串文字都将是str的实例或MyStr的实例。>>>x2=MyStr(“haha2”)>>>isinstance(x2,MyStr)True>>>isinstance(x2,str)True@it_is_a_literature-是的,这是预期的,因为
    MyStr
    str
    的子类<代码>isinstance考虑继承。如果您需要直接测试,您可以随时执行
    类型(x)is MyStr
    。但是请注意,很少需要这样做。