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

it_*_*ure 4 python string methods class

def change(s):
    result=""
    for index,item in enumerate(s):
        if(index%2 !=0): result=result+item
    return(result)
Run Code Online (Sandbox Code Playgroud)

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

>>> x="hallo world"
>>> change(x)
'al ol'
Run Code Online (Sandbox Code Playgroud)
  1. 如何将它变成str课堂上的方法?当你x.change() 在Python控制台中输入 时,我会得到相同的输出change(x).x.change()会得到的'al ol'.

  2. dir(x)将得到'change'输出,如:

    ['__add__', '__class__', ...omitted..., 'zfill', 'change'] 
    
    Run Code Online (Sandbox Code Playgroud)

iCo*_*dez 5

你不能这样做.好吧,至少不是直接的.Python不允许您向内置类型添加自定义方法/属性.这只是一种语言规律.

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

class MyStr(str):
    def change(self): # 's' argument is replaced by 'self'
        result=""
        for index,item in enumerate(self): # Use 'self' here instead of 's'
            if(index%2 !=0): result=result+item
        return(result)
Run Code Online (Sandbox Code Playgroud)

演示:

>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)

MyStrstr在各方面都会像普通类一样运行.实际上,它具有以下所有功能str:

>>> x = MyStr("hallo world")
>>> x.upper()
'HALLO WORLD'
>>> x.split()
['hallo', 'world']
>>>
Run Code Online (Sandbox Code Playgroud)

两者之间的唯一区别是MyStr有一个额外的change方法.