在Python中,您可以像在JavaScript中一样对字符串函数进行原型化吗
在JavaScript中,您可以这样做,向现有原型函数添加修剪函数在Python中,您可以像在JavaScript中一样对字符串函数进行原型化吗,javascript,python,prototype,Javascript,Python,Prototype,在JavaScript中,您可以这样做,向现有原型函数添加修剪函数 String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); 然后你可以这样做来访问这些函数 trimmed = myString.trim(); 你有一根修剪过的绳子 在python中,我知道如何通过以下操作列出字符串的原型函数: print dir(myString) 但是如何在Python中添加原型函数呢?首先,Pytho
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
然后你可以这样做来访问这些函数
trimmed = myString.trim();
你有一根修剪过的绳子
在python中,我知道如何通过以下操作列出字符串的原型函数:
print dir(myString)
但是如何在Python中添加原型函数呢?首先,Python有一个基于类的对象系统,而不是像JavaScript那样基于原型的系统 向类或实例添加方法(或其他属性)非常简单:
FooClass.method = my_method
foo_instance.method = my_method
但是,它不适用于许多“内置”类型(实际的内置类型和在C扩展中定义的类型)。而str
就是其中之一
所以,你不能这么做
但是,构建几乎任何类型的子类都非常容易:
class MyStringType(str):
def trim(self):
# your implementation here
您可能需要一个自定义的\uuuuu init\uuu
方法,也可能需要一个自定义的\uuuu new\uuuu
。还要确保将所有返回str
的方法改为返回MyStringType
另一种方法是通过授权:
class MyStringType(object):
def __init__(self, *args, **kwargs):
self.s = str(*args, **kwargs)
def trim(self):
# your implementation here
这样,您将被迫从str
显式转发您想要的每个方法,而不是自动获取它们。但通常情况下,这样做会更好。特别是考虑到您可以通过实现自定义的\uuuu getattr\uuuuu
或编程来构建转发方法(在\uuuu init\uuuu
或类范围内)来实现这一点
但最简单的解决办法是…不要这样做。使用带有
str
参数的trim
函数有什么问题
这样做的好处是trim
函数可以接受任何类似字符串的对象。例如,您的trim
函数(在一些已编译的正则表达式r
上作为r.replace
的包装编写)将同时使用unicode
和bytes
(其中一个在2.x中是str
的同义词,另一个在3.x中是…但如果您可以同时处理这两个,那就没关系了),使用PyObjCNSString
wrapper或pywin32BSTR
wrapper,依此类推。find
类型的方法甚至可以在mmap
区域上工作。为什么要将其限制为仅在str
上工作
这种“duck类型化”是Python工作方式的核心。如果您的代码没有理由关心对象的实际类型,那么您不应该特意关心它。您不能。您必须创建子类以及如何在python中创建子类?@DKean创建一个继承自
str
的类,并指定您的method@lan我不知道你对inherit的确切意思,因为我不知道在哪里可以找到str
的代码。你能举个例子吗?@DKean:你不需要知道代码在哪里。只需将str
列为您的(第一个)基类,而不是object
,您已经对str
进行了子类化。非常有趣且详尽的回答。我不能说我听懂了你说的每一句话,但我得花几分钟时间把它再读一遍,直到它完全听懂为止。功能正常。问这个问题的原因是,我已经厌倦了用几种语言打字,我正在尝试统一我编写的代码,至少看起来类似于某种程度。但是,正如我所说,函数对我来说是可以的。我会接受你的建议。谢谢…@DKean:尝试用多种语言编写相同的代码是个坏主意。Python和JavaScript是非常不同的语言;当逐行翻译成另一种语言时,用一种语言做某事的最好方法往往是非常糟糕的。(如果你加上C或Lisp,情况会更糟。)我看不出它有这么大的问题,除非它成为一个速度问题。在这种情况下,我打算使用更快的方法。但也有编写代码的速度,而不是浏览网站,试图记住LTRM()是如何真正完成的!因此,虽然我非常感谢您的帮助,但我也保留尽可能多地实现isomophism的权利,以简化我的编码。我下定决心要这么做。但是,谢谢你的帮助。你帮了大忙。