说明
《Python 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
如果要自定义数据类型,继承 Python 内置 collections 模块的 UserString 类是用作字符串对象的外包装。对这个类的需求已部分由直接创建 str 的子类的功能所替代;不过,这个类处理起来更容易,因为底层的字符串可以作为属性来访问。
与 UserDict 类似,我不也不建议直接继承 string 基础类,而是使用 Python 内置 collections 模块提供 UserString 。直接子类化内置类型(如 dict、list 或 str)容易出错,因为内置类型的方法通常会忽略用户覆盖的方法。不要子类化内置类型,用户自己定义的类应该继承 collections 模块中的类,例如 UserDict、UserList 和 UserString,这些类做了特殊设计,因此易于扩展。
具体可参考本教程 UserDict 中的说明。
collections.UserString(seq)
模拟一个字符串对象。这个实例对象的内容保存为一个正常字符串,通过 UserString 的 data 属性存取。实例内容初始化设置为 seq 的 copy。seq 参数可以是任何可通过内建 str() 函数转换为字符串的对象。
以下给字符串增加了提出数字的功能:
import collections
class MyStr(collections.UserString):
def get_number(self):
numbers = filter(str.isdigit, self.data)
return int(''.join(numbers))
text = MyStr('3山5岳,7上8下')
text.get_number()
# 3578
data 是一个真正的 str 对象用来存放 UserString 类的内容。
text.data
# '3山5岳,7上8下'
type(text)
# __main__.MyStr
type(text.data)
# str
要继承字符相关的功能不要使用内置的 str,应该使用 UserString,UserString 自身不是继承 str 而是 Sequence。这些问题只发生在 C 语言实现的内置类型内部的方法委托
上,但是为了让程序更加兼容有更好的执行效果,应该避免继承 list。在这方面 PyPy 的行为比 CPython 较好些。
UserDict、UserList 和 UserString 虽然没有内置类型的速度快,但是易于扩展。
更新时间:2021-10-08 20:44:56 标签:python string