5

在 JavaScript 中,您可以这样做以将修剪函数添加到现有原型函数

String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g,"");

然后你可以做这样的事情来访问这些功能。

trimmed = myString.trim();

你有一个修剪过的字符串。

在python中,我知道如何通过这样做列出字符串的原型函数:

print dir(myString)

但是如何在 Python 中添加原型函数呢?

4

1 回答 1

14

首先,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.replacerunicodebytesstrNSStringBSTRfindmmapstr

这种“鸭式打字”是 Python 做事方式的核心。如果您的代码没有理由关心对象的实际类型,那么您不应该特意去关心它。

于 2013-03-18T17:38:22.137 回答