__init__
には必ずしも必要ではない変数の初期化は、実際には任意のデフォルト値にすることをお勧めします。
この場合、OOの使用について質問しますが、__init__
がすべてを実行しない有効かつ分かりやすいケースがあると確信しています。クラスはさらに属性を追加することでそれ自体を変更する必要があります他の方法。
私の意見では、変数を設定しているかどうかを調べるには、hasattr
を使用することをお勧めします。これは、これがメソッドを使用する有効な方法であり、テストが賢明な方法で動作を切り替えるだけの場合です。
もう1つの方法は、それを使用して例外を処理し、クラスのユーザーが間違っていることに関するユーザーフレンドリーな情報を提供することです。これは、メソッドが実行前に属性を設定する必要がある場合です。
つまり、あなたはクラスを初期化しましたが、z_run
メソッドを実行する前にz_init
メソッドを呼び出して、z
属性が存在することを確認する必要があります。
もう1つ、おそらくもっとpythonicな方法は、ドキュメントストリングでメソッドを使用する方法を文書化し、不適切に使用されたときに例外を飛ばすことです。これは何かの最初の実装には十分であり、次のタスクに集中することができます。これは上記と同じ状況にあり、メソッドは属性を設定する必要があります。
変数を任意のデフォルト値に初期化するという考えが嫌いな理由は、これは混乱する可能性があります(任意であるため)、ラインノイズです。
値がではなく、であり、変更可能な既定値の場合は、オーバーライドできる__init__
メソッドの既定値を使用する必要があります。実際には有効な初期状態でもあり、ではなく、であり、__init__
メソッドで設定する必要があります。
はに依存しているため、他の方法で属性を追加したり、属性を任意の値に初期化することで、OOを使用することをお勧めします。
Simeon Visserはオブジェクトを一貫性のある状態に保つと言っていますが、抽象的な例に基づいてどのような一貫性があるかについての根拠はありません。 Pylintはこのようなことについて警告していますが、糸くずのプログラムからの警告は単に高いレベルの査読者には、通常はがコードの匂いを示していることを警告できます。本当の批評家があなたのコードをすべて読んで理解し、パイリントを本当に必要としないので、高レベルの批評家と言います。
親指のルールを破っ例:
class Mutant(object):
"""A mutant!"""
def __init__(self):
"""A mutant is born with only 1 eye and 1 mouth"""
self.eyes = 1
self.mouth = 1
self.location = 'Montana'
def roll_to(self, location):
"""If they have limbs, running is less dangerous"""
if hasattr(self, 'limbs'):
print 'Your mutant broke its limbs off!!'
del self.limbs
self.location = location
def run_to(self, location):
"""If they don't have limbs, running is not effective"""
if not hasattr(self, 'limbs'):
print 'Your mutant tries to run but he has no limbs.'
else:
self.location = location
def grow_limbs(self, number_of_limbs):
"""Ah, evolution!"""
assert number_of_limbs > 0, 'Cannot grow 0 or less limbs...'
if hasattr(self, 'limbs'):
self.limbs += number_of_limbs
else:
self.limbs = number_of_limbs
合意しました。一貫性が重要です。外部の人があなたのAPIやクラスを無効な状態で使用することは望ましくありません。 –
「一貫性のある状態」の意味を簡単に定義できますか?インスタンス化後に新しいメンバ変数を追加する必要はありませんか? – user1893354
@ user1893354インスタンス化の後に変数を追加することはできますが、オブジェクトを作成したり、1つ以上のメソッドを呼び出したり、面倒なオブジェクトを作成することはできません。メソッドとその戻り値の動作は、常に一貫していなければなりません。例えば、「壊れた」と「正しく機能する」と報告する 'Car'クラスを持つことはできません。 –