首先,Python 有一个基于类的对象系统,而不是像 JavaScript 这样的基于原型的系统。
为类或实例添加方法(或其他属性)非常简单:
FooClass.method = my_method
foo_instance.method = my_method
但是,它不适用于许多“内置”类型(实际内置,以及在 C 扩展中定义的那些)。并且str
是其中之一。
所以,你不能这样做。
但是,构建几乎任何类型的子类都非常容易:
class MyStringType(str):
def trim(self):
# your implementation here
您可能需要一个自定义__init__
方法,并且可能需要一个自定义__new__
. 还要确保将所有返回 a 的方法更改str
为返回 a MyStringType
。
另一种方法是通过委托:
class MyStringType(object):
def __init__(self, *args, **kwargs):
self.s = str(*args, **kwargs)
def trim(self):
# your implementation here
这样,您将被迫显式转发您想要的每个方法str
,而不是自动获取它们。但通常这样会更好。特别是考虑到您可以通过实现自定义__getattr__
或以编程方式构建转发方法(在__init__
或类范围内)来实现它的简单程度。
但最简单的解决方案是……不要这样做。有一个trim
带参数的函数有什么问题str
?
这样做的好处是你的trim
函数可以接受任何类似字符串的对象。例如,您的函数(在某些已编译的 regex 上trim
编写为包装器)将同时使用和(其中一个是2.x 中的同义词,另一个是 3.x 中的同义词……但如果您可以同时处理这两者,那就不没关系),并使用 PyObjC包装器或 pywin32包装器,依此类推。A -type 方法甚至适用于区域。为什么将其限制为仅适用于?r.replace
r
unicode
bytes
str
NSString
BSTR
find
mmap
str
这种“鸭式打字”是 Python 做事方式的核心。如果您的代码没有理由关心对象的实际类型,那么您不应该特意去关心它。