Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/423.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,您可以像在JavaScript中一样对字符串函数进行原型化吗_Javascript_Python_Prototype - Fatal编程技术网

在Python中,您可以像在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

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

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中是…但如果您可以同时处理这两个,那就没关系了),使用PyObjC
NSString
wrapper或pywin32
BSTR
wrapper,依此类推。
find
类型的方法甚至可以在
mmap
区域上工作。为什么要将其限制为仅在
str
上工作


这种“duck类型化”是Python工作方式的核心。如果您的代码没有理由关心对象的实际类型,那么您不应该特意关心它。

您不能。您必须创建子类以及如何在python中创建子类?@DKean创建一个继承自
str
的类,并指定您的method@lan我不知道你对inherit的确切意思,因为我不知道在哪里可以找到
str
的代码。你能举个例子吗?@DKean:你不需要知道代码在哪里。只需将
str
列为您的(第一个)基类,而不是
object
,您已经对
str
进行了子类化。非常有趣且详尽的回答。我不能说我听懂了你说的每一句话,但我得花几分钟时间把它再读一遍,直到它完全听懂为止。功能正常。问这个问题的原因是,我已经厌倦了用几种语言打字,我正在尝试统一我编写的代码,至少看起来类似于某种程度。但是,正如我所说,函数对我来说是可以的。我会接受你的建议。谢谢…@DKean:尝试用多种语言编写相同的代码是个坏主意。Python和JavaScript是非常不同的语言;当逐行翻译成另一种语言时,用一种语言做某事的最好方法往往是非常糟糕的。(如果你加上C或Lisp,情况会更糟。)我看不出它有这么大的问题,除非它成为一个速度问题。在这种情况下,我打算使用更快的方法。但也有编写代码的速度,而不是浏览网站,试图记住LTRM()是如何真正完成的!因此,虽然我非常感谢您的帮助,但我也保留尽可能多地实现isomophism的权利,以简化我的编码。我下定决心要这么做。但是,谢谢你的帮助。你帮了大忙。