[解決済み] Pythonでインスタンス変数のデフォルト値をどのように宣言すればよいですか?
2022-12-26 12:39:23
質問
クラスのメンバにデフォルト値を与えるべきでしょうか?
class Foo:
num = 1
とか、こんな感じ?
class Foo:
def __init__(self):
self.num = 1
で この質問 の両方で発見しました。
bar = Foo()
bar.num += 1
はよく定義された操作です。
最初のメソッドがクラス変数を与えるのに対して、2番目のメソッドはそうでないことは理解しています。しかし、私がクラス変数を必要とせず、インスタンス変数にデフォルト値を設定する必要がある場合、両方の方法は同じように良いですか?それとも、どちらかが他よりも「パイソン的」なのでしょうか?
私が気づいたことの1つは、Djangoチュートリアルで を使うと、モデルを宣言するのに2番目の方法を使うということです。 個人的には 2 番目の方法の方がエレガントだと思うのですが、「標準的な」方法は何なのか知りたいところです。
どのように解決するのですか?
bpの回答を拡張して、私は彼がimmutable型によって何を意味するのかを示したいと思いました。
まず、これは大丈夫です。
>>> class TestB():
... def __init__(self, attr=1):
... self.attr = attr
...
>>> a = TestB()
>>> b = TestB()
>>> a.attr = 2
>>> a.attr
2
>>> b.attr
1
しかし、これはimmutable(変更不可)な型に対してのみ動作します。もしデフォルト値がmutable(置き換えられるという意味)であれば、代わりにこれが起こるでしょう。
>>> class Test():
... def __init__(self, attr=[]):
... self.attr = attr
...
>>> a = Test()
>>> b = Test()
>>> a.attr.append(1)
>>> a.attr
[1]
>>> b.attr
[1]
>>>
ただし
a
と
b
には共有属性があります。これはしばしば望まれないことです。
これは、インスタンス変数がmutableである場合に、デフォルト値を定義するためのPythonicな方法です。
>>> class TestC():
... def __init__(self, attr=None):
... if attr is None:
... attr = []
... self.attr = attr
...
>>> a = TestC()
>>> b = TestC()
>>> a.attr.append(1)
>>> a.attr
[1]
>>> b.attr
[]
私の最初のコードが動作する理由は、不変の型では、Pythonは必要なときにいつでもその新しいインスタンスを作成するからです。もし1に1を足す必要があるなら、古い1は変更できないので、Pythonはあなたのために新しい2を作成します。その理由は、主にハッシュ化のためだと私は考えています。
関連
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] 列の値に基づいてDataFrameから行を選択するにはどうすればよいですか?
-
[解決済み] 環境変数の値にアクセスする方法
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのコンストラクタとデフォルト値 [重複] [重複
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] Pythonのキャッシュライブラリはありますか?
-
[解決済み] Django のテストデータベースをメモリ上だけで動作させるには?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] DataFrameに日付間の日数カラムを追加する pandas
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Pythonで、ウェブサイトが404か200かを確認するためにurllibをどのように使用しますか?
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] Pythonでランダムなファイル名を生成する最良の方法