我可以向内置Python类型添加自定义方法/属性吗?

2024-06-13 20:34:55 发布

您现在位置:Python中文网/ 问答频道 /正文

例如,我想向Python的dict类型添加一个helloWorld()方法。我能做这个吗?

JavaScript有一个这样的原型对象。也许这是一个糟糕的设计,我应该对dict对象进行子类划分,但它只对子类起作用,我希望它能对任何和所有未来的字典起作用。

下面是在JavaScript中的实现方式:

String.prototype.hello = function() {
    alert("Hello, " + this + "!");
}
"Jed".hello() //alerts "Hello, Jed!"

这里有一个有用的链接,包含更多示例-http://www.javascriptkit.com/javatutors/proto3.shtml


Tags: 对象方法类型hellostring字典方式javascript
3条回答

不能直接将方法添加到原始类型。但是,您可以将该类型子类化,然后在内置/全局命名空间中替换它,从而实现所需的大部分效果。不幸的是,由文本语法创建的对象将继续是普通类型,并且不会有新的方法/属性。

这是它的样子

# Built-in namespace
import __builtin__

# Extended subclass
class mystr(str):
    def first_last(self):
        if self:
            return self[0] + self[-1]
        else:
            return ''

# Substitute the original str with the subclass on the built-in namespace    
__builtin__.str = mystr

print str(1234).first_last()
print str(0).first_last()
print str('').first_last()
print '0'.first_last()

output = """
14
00

Traceback (most recent call last):
  File "strp.py", line 16, in <module>
    print '0'.first_last()
AttributeError: 'str' object has no attribute 'first_last'
"""

是的,通过子类化这些类型。见unifying types and classes in Python

不,这并不意味着实际的听写会有这种类型,因为那会让人困惑。子类化内置类型是添加功能的首选方法。

刚试过福比登弗瑞特!

这是代码,非常简单!

from forbiddenfruit import curse


def list_size(self):
    return len(self)

def string_hello(self):
    print("Hello, {}".format(self))

if __name__ == "__main__":
    curse(list, "size", list_size)
    a = [1, 2, 3]
    print(a.size())
    curse(str, "hello", string_hello)
    "Jesse".hello()

相关问题 更多 >