2017-11-19 27 views
0

関数の引数としてオブジェクトを渡すときに呼び出される魔法の方法はありますか?関数を引数としてオブジェクトを渡すためのマジックメソッド?

class Test: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
    def __???__(self): 
     return (self.a, self.b) 

test = Test(0, 1) 

some_function(test) # I'd like to pass parameters (0, 1) here 
+6

いいえ、ありません。それは非常に混乱するでしょう。ただし、 '__iter__'を実装し、' some_function(* test) 'を呼び出すことはできます。 – Ryan

+0

Pythonには魔法はありません。あなたは魔法のためにRubyを見たいかもしれません。 –

+2

Pythonコア開発者Raymond Hettingerの[この回答](https://stackoverflow.com/a/8601389/4014959)も参照してください。 –

答えて

2

いいえ、関数の引数は特別な扱いを受けません。これは単なる別の代入(関数のパラメータ名への代入)です。

あなたは、個別の引数としてabを扱うTestシーケンスを行い、その後、引数を分離するためのシーケンスを展開する*sequence呼び出し構文でそれを渡す必要がある場合。あなたはそれをiterator typeを作ることによって、それシーケンス作ることができます。

class Test: 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
    def __iter__(self): 
     return iter((self.a, self.b)) 

test = Test(0, 1) 
some_function(*test) 

デモ:

>>> def some_function(a, b): 
...  print(f'a = {a!r}\nb = {b!r}') 
... 
>>> test = Test(0, 1) 
>>> some_function(*test) 
a = 0 
b = 1 
+0

[PEP 498 f-strings](https://www.python.org/dev/peps/pep-0498/)の良い例もあります。 –

+0

私は、f-stringを評価する必要があるという印象を受けています。 2つの質問は、some_functionがself.aの値を渡しているか、実際にポインタを渡していて、print文を調べていますか?値が最終的にf-stringに渡される場合、ここで!rを使用する利点は何ですか? – Rookie

+1

@Rookie:はい、 'f'文字列は結果が補間される式を指定します。 'str.format()'は、 'a = {!r} \ nb = {!r} 'と同じ形式です(format(a、b)')。 'a'と' b'は 'some_function()'関数のちょうど*ローカル変数*です。それがあなたの理解をより良くするのであれば、それらの名前を変えることができます。 –

関連する問題