2017-05-25 8 views
3

私は現在OOPを学んでいます.Dictを変数として格納するクラスを作成しましたself.fooPython - クラス変数を返すベストプラクティスは何ですか?

class FooBar: 

    def __init__(self): 
     self.foo = {} 

    def bar(self): 
     return self.foo 


if __name__ == '__main__': 
    FooBar() 

私の質問はこれです:私はself.fooを返すメソッドbarを作成しました。クラス変数を直接呼び出してbarメソッドを使用すると、同じ結果が得られます。これはself.fooにアクセスする正しい方法ですか、それとも違いはありませんか?

はここにいくつか例を示します。

>>>test = FooBar() 
>>>test.foo['test'] = 'This is a test' 
>>>print(test.foo) 
'{'test': 'This is a test'}' 

>>>test.bar()['test_2'] = 42 
>>>print(test.bar()) 
'{'test': 'This is a test', 'test_2': 42}' 
+1

"これはself.fooにアクセスする正しい方法です" - クラスがどのようなもので、どのように文書化されているかによって異なります。 – khelwood

+6

'@ property'デコレータについて知りたいかもしれません:https://stackoverflow.com/a/17330273/295246 –

答えて

2

どちらの方法が正しいか、それはあなたが選択した1あまり違いはありません。 bar(self)メソッドのアプローチは、通常はプライベートメンバーにアクセスするために他のOO言語でよく使われる古典的な "ゲッター"アプローチですが、Pythonのようにゲッターメソッドbar(self)を使用すると、すべてのメンバーがデフォルトで公開されますメンバーfooに直接電話をかけてください。

また、getterメソッドでは、別の名前のメンバーfooにアクセスする場合は、@propertyデコレータを使用することもできます。しかし、別の名前でアクセスして返す前にfooメンバーで何もする必要がない場合は、fooメンバーへの参照をコンストラクタにself.bar = self.fooというように追加するだけで、別のメンバーのメンバーにアクセスできるようになります名。 (私はメソッドを作成することに過度の努力をしていると思います。あるいは、別の名前でメンバーにアクセスするためにプロパティを使用するだけで、メンバーへの参照を使用しますが、それは私の個人的な好みです)。

ただし、メンバーを非公開として扱い、クラス内またはセッターメソッド内でのみ変更する必要があることを示す場合は、_fooのように_でメンバー名を開始するのが一般的です。

+0

+1素晴らしい答え。私が言うつもりだったすべて。私は1つを追加します。パブリックメンバーにゲッターメソッドとセッターメソッドをコーディングするのは難しくありません。このような変数にアクセスしたい場合は、答えに記述されているように非公開にする必要があります。 – SH7890

0

あなたはいつもpropertyデコレータを使用する必要があります。

関数から変数を直接返すのであれば、それは間違っているので、読者は呼び出された関数に計算や修正があると思うかもしれませんが、実際には変数を渡すだけです読者にもっと明確な文脈を与える。

class FooBar: 

    def __init__(self): 
     self.foo = {} 
    @property 
    def bar(self): 
     return self.foo 

その後のようにアクセス、

>>>test = FooBar() 
>>>test.foo['test'] = 'This is a test' 
>>>print(test.foo) 
'{'test': 'This is a test'}' 

>>>test.bar['test_2'] = 42 
>>>print(test.bar) 
'{'test': 'This is a test', 'test_2': 42}' 
+1

"常に 'property'デコレータを使うべきですか?それは一体何の意味ですか?どのような状況でも、プロパティは常に適切な選択ですか? – khelwood

+0

@khelwoodが説明を追加しました。 – harshil9968

関連する問題