2011-01-15 12 views
5

可能性の重複カスタムメソッドを追加します。は、文字列オブジェクトに

class String 
    def sayHello 
    return self+" is saying hello!" 
    end 
end        

puts 'JOHN'.downcase.sayHello # >>> 'john is saying hello!' 
:Rubyで

Can I add custom methods/attributes to built-in Python types?

を、あなたは、このように、独自の方法で任意の組み込みのオブジェクトクラスをオーバーライドすることができます

どうすればいいですか?通常のやり方はありますか?あなたは組み込み-タイプはあなたが何ができるかC.でコード化されていることができないので

+1

これはちょうどhttp://stackoverflow.com/questions/4698493/can-i-add-custom-methods-attributes-to-built-in-python-types/4698550#4698550で回答されています。閉鎖を提案する。 – TryPyPy

+0

Monkeypatchingは可能ですが、その質問で指摘されているように(しかもさらに)制限があります。私はちょうどこれを行う "フリー"関数を定義することをお勧めします。 – delnan

答えて

11

はタイプをサブクラスである:

class string(str): 
    def sayHello(self): 
     print(self, "is saying 'hello'") 

はテスト:

>>> x = string("test") 
>>> x 
'test' 
>>> x.sayHello() 
test is saying 'hello' 

またstr-を上書きする可能性がclass str(str):と入力してください。ただし、"test"のリテラルは、組み込みのstrにリンクしているため使用できません。

def sayhello(name): 
    return "{} is saying hello".format(name) 

>>> sayhello('JOHN'.lower()) 
'john is saying hello' 

シンプルで清潔で使いやすい:

>>> x = "hello" 
>>> x.sayHello() 
Traceback (most recent call last): 
    File "<pyshell#10>", line 1, in <module> 
    x.sayHello() 
AttributeError: 'str' object has no attribute 'sayHello' 
>>> x = str("hello") 
>>> x.sayHello() 
hello is saying 'hello' 
3

これまで通常のPython同等のは、それが最初の引数だとして文字列を取る関数を書くことです。すべてがメソッド呼び出しでなければならないわけではありません。

+0

この方法の欠点は、ミューテータメソッドを記述できないことです。たとえば、今日は、オプションの接頭辞 'p'を削除するために' str'を変更し、接頭辞が見つかった場合は 'True'を返し、見つからなかった場合は' False'を返す 'str.startswithThenRemove(p)'メソッドが必要です: 'if option.startswithThenRemove(" - foo = "):handleFoo(オプション)'。 Pythonでは簡単にはできません(しかしhttp://stackoverflow.com/a/1551223/1424877を参照)。 – Quuxplusone

+4

文字列にカスタムメソッドを追加できたとしても、まだミューテータメソッドを書くことはできません。Python文字列は不変です。 – Duncan

関連する問題