2017-11-02 13 views
2

クラスを学習していて、いくつかの文字列関数を実行するクラスを作成する演習があります。一つは、文字列を取得する必要がありますし、あなたが本当にdef __init__:この下の変数を作成する必要がある場合、他の文字列を印刷する必要がありますが、私は思っていた答えが見えるようになっているものです。クラス内のすべての変数を初期化で作成する必要がありますか?

class InputOutString(object): 
    def __init__(self): 
     self.s = "" 

    def getString(self): 
     self.s = raw_input() 

    def printString(self): 
     print self.s.upper() 

私はそれがあろうと考えていました生の入力を取得したときに変数を作成するほうがずっと便利です。

+0

なぜあなたは単に 'getString()'を忘れて初期化中に入力を入れないのですか? – 0TTT0

+4

はJava開発者が書いたPythonのようです。いいえ、初期化する必要はありませんが、それは良い方法です。 – Cfreak

+1

'def printString(self)'の代わりに 'def __repr __(self)'を使うこともできます。 'def __repr __(self)'は、変数にprint関数を使用するときの動作を設定します。 – Erlinska

答えて

3

金田。

Pythonではこれを強制するものではありませんが、そうしないと問題が発生することがあります。

は、例えば - 、あなたの例では、あなたが__init__sをinitaliseない場合は、まだgetStringと呼ばれていなかったならば、printStringは、例外を発生させるでしょう。しかし、それを初期化した場合(あなたの例のように)、代わりに空文字列が表示されます。これは多くの場合望ましいでしょう。

__init__のすべての変数を有効にすると、必要なときにそれらがすべて存在することが保証されます。それが良い習慣である理由です。

あなたがそれを行うべきもう一つの理由は、それはPythonの生活をより簡単にすることですwhen determining the amount of memory required to store your class。 Pythonは__init__に設定されている属性を検出し、それに応じてサイズを割り当てます。これを(期待していなかったクラスに新しい属性を保存することで)変更すると、クラスアップの結果、各インスタンスのメモリオーバーヘッドが簡単に2倍になる可能性があります。 (ありがとう@ShadowRangerこれを指摘する)

+1

オブジェクトの多くのインスタンスが作成されたときのメモリ使用量を減らすのにも役立ちます。 '__init__'ですべてのインスタンス属性を初期化できないと、[キー共有' dict'最適化がPEP 412から壊れる可能性があります](https://www.python.org/dev/peps/pep-0412/#split-table-dictionaries) ;そうすることで、各インスタンスに値だけでなく、属性名とハッシュのコピーを格納するように要求することで、インスタンスあたりのメモリーオーバーヘッドを約2倍にすることができます。 – ShadowRanger

+0

今日私は学んだ。私はそれを答えに加えます。仲間の影から学ぶことは常に良いことです:P – Shadow

関連する問題