如何将自己的方法添加到内置的 str 类型中?
How to add my own method to the built-in str type?
def change(s):
result=""
for index,item in enumerate(s):
if(index%2 !=0): result=result+item
return(result)
这个函数可以将一个字符串中的所有偶数字符提取到一个新的字符串中:
>>> x="hallo world"
>>> change(x)
'al ol'
如何将它变成 str
类的方法?当您在 Python 控制台中输入 x.change()
时,我会得到与 change(x)
相同的输出。 x.change()
将获得 'al ol'
。
dir(x)
将在输出中得到 'change'
例如:
['__add__', '__class__', ...omitted..., 'zfill', 'change']
你不能这样做。好吧,至少不是直接的。 Python 不允许您向内置类型添加自定义 methods/attributes。这简直就是语言的规律。
但是您可以通过 subclassing(继承自)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)
演示:
>>> 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
class 在各个方面都与正常的 str
class 一样。事实上,它具有 str
:
上的所有功能
>>> x = MyStr("hallo world")
>>> x.upper()
'HALLO WORLD'
>>> x.split()
['hallo', 'world']
>>>
两者唯一的区别是MyStr
增加了change
方法。
def change(s):
result=""
for index,item in enumerate(s):
if(index%2 !=0): result=result+item
return(result)
这个函数可以将一个字符串中的所有偶数字符提取到一个新的字符串中:
>>> x="hallo world"
>>> change(x)
'al ol'
如何将它变成
str
类的方法?当您在 Python 控制台中输入x.change()
时,我会得到与change(x)
相同的输出。x.change()
将获得'al ol'
。dir(x)
将在输出中得到'change'
例如:['__add__', '__class__', ...omitted..., 'zfill', 'change']
你不能这样做。好吧,至少不是直接的。 Python 不允许您向内置类型添加自定义 methods/attributes。这简直就是语言的规律。
但是您可以通过 subclassing(继承自)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)
演示:
>>> 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
class 在各个方面都与正常的 str
class 一样。事实上,它具有 str
:
>>> x = MyStr("hallo world")
>>> x.upper()
'HALLO WORLD'
>>> x.split()
['hallo', 'world']
>>>
两者唯一的区别是MyStr
增加了change
方法。