2017-02-07 11 views
2

は、私は次のクラスを与えられたと仮定しますPythonで関数連鎖を行うとき、 "現在の"オブジェクトを参照する方法はありますか?

class foo(object): 

    def __init__(self, int): 
     self.count = int 

    def increment(self, int): 
     return foo(int + 1) 

    def decrement(self, int): 
     return foo(int - 1) 

私の目標は、関数が変数に各オブジェクトを割り当てることなく、私が欲しいの結果に到達するために呼び出すチェーンに一緒です。例えば、私は私がこれを行うことができます知っている:

obj = foo(0) 
obj = obj.increment(obj.count) 
obj = obj.decrement(obj.count) 
obj = obj.increment(obj.count) 
obj = obj.decrement(obj.count) 
print obj.count 
0 

を私はこれを行うにできるようにしたいと思います:

finalcount = obj(0).increment(?.count).decrement(?.count) 

を私がで置くことができる何かがあるかどうかはわかりませんそのオブジェクトに名前が割り当てられていないため、メソッドが呼び出されているオブジェクトを参照するための場所は?です。

+0

各メソッドの最後にちょうど 'return self '。フレーズ* "流暢なインターフェイス" *あなたの研究に役立つかもしれません。 – jonrsharpe

+0

@jonrsharpeさて、OPの例では、新しいインスタンスが作成されてもうまくいきません。 – wim

+1

このクラスのメソッドのどれも、インスタンス変数で実際に何もしません。 'increment'と' decrement'は、 'self.count'を増やすのではなく、何を増やすのかを議論することになっていますか?そして、あなたは彼らが 'self'を修正する(そしておそらく戻す)新しいオブジェクトインスタンスを作成しているはずですか? – user2357112

答えて

1

あなたのオブジェクトは、現在のコードでは実際に何も寄与しません。クラスのメソッドがどのオブジェクト状態も参照していないことに注意してください。それらは決してselfを使用しません。

class foo(object): 
    def __init__(self, int): 
     self.count = int 

    def increment(self): 
     return foo(self.count + 1) 

    def decrement(self): 
     return foo(self.count - 1) 

はその後、何を書きたかったことは、このようになります:ベターは完全にintパラメータを省略し、代わりにself.countを使用することです

finalcount = foo(0).increment().decrement() 

しかし、あなたの元の質問に答えるために、何もありませんコールのチェーン内の「現在の」オブジェクトを参照する方法。中間オブジェクトを参照する場合は、そのオブジェクトを変数に割り当てる必要があります。

+0

私は本当に本当の質問をするために愚かなクラスを一緒に投げた:鎖の一部として作成されたオブジェクトを参照することは可能ですか?私が心に留めている特定の 'pandas.dataframe'という質問に入ることができますが、私は関数が引数を必要とする一般的なことをする能力について興味がありました。あなたが使用したい引数はクラスのメンバー。 – JHixson

+0

私の最後の段落は、動機付けの例の品質にかかわらず、あなたの質問に対処します。 –

+0

ありがとうRob!それは本当に私が知りたかったものでした。それを知って、私は実行している特定の問題について別の質問をすることができる、それは私がこのトピックに興味があることに取り組んでいる間だけです。 – JHixson

0

は、それはこのようになります:

class Foo(object): 

    def __init__(self, count): 
     self.count = count 

    def increment(self): 
     self.count += 1 
     return self 

    def decrement(self): 
     self.count -= 1 
     return self 

しかし、それは非常にPython的ではないと私はパターンをお勧めしません。呼び出し元にはすでに参照があります(呼び出すには参照する必要があります)ので、別の参照を返す必要はありません。

一般に、メソッドがデータを変更する場合、Pythonでは何も返されません。このステートメントの逆は、メソッドが値を返す場合、メソッドはデータを変更すべきではありません。もちろん、これはPythonスタイルのガイドラインに過ぎませんが、インターフェイスを設計するときは、期待とは異なる行動を持つ開発者を驚かせることはできません。

関連する問題