在Python中,您可以像JavaScript一样对字符串函数进行原型设计

DKe*_*ean 4 javascript python prototype

在JavaScript中,您可以执行此操作以将trim函数添加到现有原型函数中

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

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

trimmed = myString.trim();
Run Code Online (Sandbox Code Playgroud)

你有一个修剪过的绳子.

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

print dir(myString)
Run Code Online (Sandbox Code Playgroud)

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

aba*_*ert 12

首先,Python有一个基于类的对象系统,而不是像JavaScript这样的基于原型的系统.

添加方法(或其他属性)类或实例非常简单:

FooClass.method = my_method
foo_instance.method = my_method
Run Code Online (Sandbox Code Playgroud)

但是,它不适用于许多"内置"类型(实际内置类型,以及那些在C扩展中定义的类型).而str就是其中之一.

所以,你不能这样做.


但是,构建几乎任何类型的子类都非常容易:

class MyStringType(str):
    def trim(self):
        # your implementation here
Run Code Online (Sandbox Code Playgroud)

您可能需要一个自定义__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
Run Code Online (Sandbox Code Playgroud)

这样,您将被迫显式转发您想要的每个方法str,而不是自动获取它们.但无论如何,这往往更好.特别是考虑到你可以做到这一点,通过实现自定义__getattr__,或者通过programmaticaly构建转发方法(在__init__类或类中).


但最简单的解决方案是......不要这样做.使用trimstr参数的函数有什么问题?

这样做的好处是你的trim函数可以采用任何类似字符串的对象.例如,你的trim函数(写成周围的包装r.replace上的一些编译正则表达式r)将与工作都unicodebytes(其中一个是一个同义词str在2.x中,另一个在3.x中...但如果你能处理,即没有按没关系,并使用PyObjC NSString包装器或pywin32 BSTR包装器等等.A find型方法甚至适用于mmap区域.为什么限制它只能工作str

那种"鸭子打字"是Python做事方式的核心.如果您的代码没有理由关心对象的实际类型,那么您不应该忘记关心它.