2017-09-06 5 views
0

機能my_funcは1整数であることができ、引数、またはクラスを取得:Python - 明示的にクラスオブジェクトの評価を変更するには?

class SomeClass: 
    val = 0 
    def __init__(self): 
     self.val = 0 
    def set(self, val): 
     self.val = val 
    def get(self): 
     return self.val 

をし、私は1つとして、両方のタイプで仕事をしたいです。 SomeClass SomeClassのオブジェクトの評価がオブジェクトのvalフィールドを返すはずだが、それが自らのオブジェクトではないことをPythonに明示的に伝えることはできますか? (何とか)次のコードの作業を取得することを意味し

s = SomeClass() 
s.set(3) 
test = s # this line should assign value 3(int) to test 
test # prints 3 

答えて

0

そうでもない、ない、ない、あなたが求めるように見える広い意味インチ割り当てではなく、多くの操作をオーバーロードすることができます。これは、変数はオブジェクトへの参照のみであり、型は添付されていないためです。いつでも、あなたのオブジェクトへの参照がたくさんあることがあります。オブジェクトの使用方法は、であり、割り当てられたものではありません。

代わりに、クラスを整数に変換できるようにします。 object.__int__ hookでこれを行うことができます。あなたのセッターは、明示的に渡されたオブジェクトにint()を呼び出します。

class SomeClass: 
    val = 0 
    def __init__(self): 
     self.val = 0 
    def set(self, val): 
     self.val = int(val) 
    def get(self): 
     return self.val 
    def __int__(self): 
     return self.val 

あなたは常に整数演算でこれらのオブジェクトを使用する場合は、あなたがそのようなobject.__add__object.__sub__として、これらの操作のためのフックを追加することができます。ここでもまた、オブジェクトが使用されるコンテキストが重要です。

+0

ありがとうMartijn、__int__メソッドをオーバーライドしているようです。 私のarg1には、私が行うので、もし、__int__実施される方法であるか、整数または工assオブジェクト可能性がある場合: my_arg = INT(引数1) を私はとにかく整数値を取得しますし、私は唯一のmy_argで動作することができます。 –

関連する問題