0
クラスフィールド(クラス変数)を、キーワード引数の可変デフォルト値として__init__
に使用するにはどうすればいいですか?Python - クラスフィールドを__init__のキーワード引数の値として使用する
class Foo():
field = 5
def __init__(self, arg=field): # arg=Foo.field => name 'Foo' is not defined
self.arg = arg
# ok, let's start
obj_1 = Foo()
print(obj_1.arg) # 5, cool
# then I want to change Foo.field
Foo.field = 10
print(Foo.field) # 10, obviously
obj_2 = Foo()
print(obj_2.arg) # still 5, that's sad :(
ですが、なぜでしょう:ここ
は一例ですか?
私はそのようになめらかに行うことができます知っている:
class Qux():
field = 5
def __init__(self, arg='default'):
self.arg = {True:Qux.field, False:arg}[arg == 'default']
Qux.field= 10
obj_3 = Qux()
print(obj_3.arg) # 10
しかし、もっと簡単な方法はありますか?
ありがとうございます。
待ち、これは、これらの質問のいずれかの重複はない... –
このもしそうなら、それはデフォルト値ですに設定そうではありませんが、それらの質問からの情報が役立ちます。実際には、[Fred Fooの答え](https://stackoverflow.com/a/5555470/8488611)はすべてを説明しています - "デフォルトの引数は呼び出し時ではなく関数定義時に評価されます"。ですから、クラスの中を含むキーワード引数のデフォルト値は、私の場合は常に同じオブジェクトを指しています - 不変5。デフォルト値を変更したい場合は、 'field = [5 ] ' ' self.arg = arg [0] 'そして' Foo.field [0] = 10'です。それは正常に動作しますが、それは私のQuxの例よりも醜いです:) – KalyanKruno
また、クラスプロパティまたはカスタムの可変整数オブジェクトを使用することができます。 –