2016-08-08 4 views
3

、私がやろうとしますTypeErrorがあるでしょうネイティブデータ型の演算子をオーバーロードすることは可能ですか?例えば

an_int + a_string 

:a_stringは 'STR' とan_intを入力している

a_string + an_int 

が... 'INT' を入力するか、です型の暗黙の変換がないためです。私はintとstringの独自のサブクラスを使用していた場合、これを達成するために私のクラスで__add__()メソッドをオーバーロードすることができると私は理解しています。

しかし、好奇心から、私は知っているしたいと思います:__add__(int,str)__add__(str,int)が自動的に文字列としてそれらを連結するように、intstrのクラス定義に+演算子をオーバーロードすることは可能でしょうか?

そうでなければ、プログラマがネイティブデータ型の演算子をオーバーロードしないようにすべき理由は何ですか?

+0

http://blog.teamtreehouse.com/operator-overloading-python –

+0

リンクいただきありがとうございます、それがどのように良い説明ですユーザー定義クラスの演算子をオーバーロードすることができます。しかし、 'str'や 'int'のようなネイティブデータ型に対しては可能かどうか疑問に思っています。 – Anton

+0

python 2.xまたは3.x用ですか? –

答えて

2

一般に、CレベルのAPIに戻らずに、組み込み型の属性を変更することはできません(hereを参照)。しかし、組み込み型をサブクラス化し、新しい型に必要なことをすることができます。質問あなたは(具体的にベースの追加文字列を作る)尋ね、あなたは__add__ and __radd__を変更したい場合:

class Int(int): 
    def __add__(self, other): 
     return Int(int(str(self) + str(other))) 

    def __radd__(self, other): 
     return Int(str(other) + str(self)) 

>>> Int(5) + 3 
53 

>>> 3 + Int(5) + 87 
3587 
+0

ありがとうございます。組み込み型のメンバ属性を変更できないようなPythonの理由はありますか? – Anton

+0

文字列の '__str__'形式が狂ったことを意味する可能性があり、整数の追加が何らかの理由でデバッガが動作しないため、あなたのプログラムが誤動作するかもしれないし、クレイジーなこと。 –

+0

それは賢明な音、ありがとう。 – Anton

2

としては、あなたが(あなたがあなた自身のPython実装を構築するまでのない限り)できない、先に指摘しました。つまり、コードで遭遇した場合に'1'+1の処理方法を変更することはできません。しかし、あなたは組み込み機能を台無しにすることができます、しかし、あなたしてください:

>>> int = str 
>>> type(1) 
<class 'int'> 
>>> type('1') 
<class 'str'> 
>>> int(1) 
'1' 
>>> type(int(1)) 
<class 'str'> 

これは、ファーストクラスの機能素晴らしさ、thougの啓発例よりも少しです。すべての変更は、あなたがそれらを作っている名前空間での滞在をこのを考えてみましょう。あなたは、この場合intには、あなたがstrに入れるものは何でも使用している

>>> str=int 
>>> str('1') 
1 
>>> str('asd') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for int() with base 10: 'asd' 
>>> input() 
2 
'2' 
>>> 

。しかし、input()はよく知っていて、組み込み関数に落ちます。あなたの実装を参照するクロージャーを持つ変なトリックがあるかもしれませんが、私はそれを見つけることができません。ちなみに、元のstr__builtins__.strにあります。組み込みのメソッドで同じトリックは動作しません引っ張る

>>> int.__add__ = str.__add__ 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't set attributes of built-in/extension type 'int' 
+0

非常に良い点。 –

関連する問題