1. ホーム
  2. python

[解決済み] Pythonの組み込み型にカスタムメソッドや属性を追加することはできますか?

2023-03-10 06:06:52

質問

例えば helloWorld() メソッドをPythonのdict型に追加したいとします。これは可能でしょうか?

JavaScriptにはこのように動作するプロトタイプオブジェクトがあります。多分それは悪いデザインで、私はdictオブジェクトをサブクラス化すべきですが、その場合、それはサブクラス上でのみ動作し、私はそれが将来のすべての辞書上で動作するようにしたいのです。

JavaScriptではこうなります。

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

もっと多くの例がある便利なリンクがあります。 http://www.javascriptkit.com/javatutors/proto3.shtml

どのように解決するのですか?

元の型に直接メソッドを追加することはできません。しかし、型をサブクラス化し、組み込み/グローバル名前空間でそれを置き換えることができ、望む効果のほとんどを達成できます。残念ながら、リテラル構文によって作成されたオブジェクトは、引き続きバニラ型であり、新しいメソッド/属性はありません。

以下はその様子です。

# 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'
"""