python - Pythonの他の属性定義内からクラス属性にアクセスする

python python-3.x

私はいくつかのコードを書いています。その中で、クラスはいくつかのネストされたクラスを定義しています(目的を明確にし、目的別にグループ化するため)。ネストされたクラスで、囲んでいるクラスの属性を使用したい(下記参照)。この属性は、「マジックナンバー」ではなく、包含クラスの上に設定されるデフォルト値を提供します。

 class Progress_indicator:
     #use this attribute to provide a default value
     number_of_dots=5
     class Dots:
         #the attribute above provides a default value here:
         def __init__(self, number = Progress_indicator.number_of_dots):
             self._current=0
             self._number_of_dots=number


さて、上記のコードを実行すると、次のようになります。

NameError: name 'Progress_indicator' is not defined


__init__を含む行から。
これは、Pythonがクラス宣言を参照して名前空間を定義しているが、完全なクラス宣言が処理された後(つまり、コードのインデントされたブロックが残っている)、実際にその名前空間を名前(この場合はProgress_indicator)に割り当てるためであると理解しています。 __init__の代わりにself.number_of_dotsを使用するようにProgress_indicator.number_of_dotsを再定義すると、同じエラーが生成されます(ここには継承がないため)。私が試したすべてのリファレンス(書籍、および多くのWeb)は、上記が機能することを示唆しています。しかし、そうではありません。上記のように、関数パラメーターのデフォルト値を提供するために、囲んでいるクラスで定義された属性にアクセスするきちんとした方法はありますか?
私はpython3.2を使用しています。
答え
Noneをプレースホルダー値として使用し、提供されていない場合はデフォルトの代わりに使用します。

class Indicator:
    number_of_dots = 5

    class Dots:
        def __init__(self, number = None):
            if number is None:
                number = Indicator.number_of_dots

            self._current        = 0
            self._number_of_dots = number


少し幅広かもしれませんが、名前空間の問題を回避できます。または、self._number_of_dots = number or Indicator.number_of_dotsが引数として使用できる有効な値でない場合は、0を使用できます。

def __init__(self, **kwargs)を実行してからkwargs.pop('number', Indicator.number_of_dots)を実行することもできますが、これは不明確な場合があります。
関連記事

python - CherryPyでのユーザー管理

python - GStreamerとTheora

python - DjangoカスタムChangeUserForm設定is_active、is_staff、is_superuserをFalseに設定

python - StringToSignの作成

python - 'コマンドラインインテリセンス'(TAB TAB)をPythonスクリプトで動作させる方法は?

python - 自動的にインポートされたモジュールを制御する

python - 書式付きでPythonスクリプトを保存-特殊文字

python - ツイストされた遅延コールバックチェーン

python - JSONからデータを読み込んだ後のメモリのクリーニング

python - クラスが定義されたときに自動登録する(ただし、どこにもインポートしない)