2017-08-19 15 views
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 

しかし、もっと簡単な方法はありますか?
ありがとうございます。

+0

待ち、これは、これらの質問のいずれかの重複はない... –

+0

このもしそうなら、それはデフォルト値ですに設定そうではありませんが、それらの質問からの情報が役立ちます。実際には、[Fred Fooの答え](https://stackoverflow.com/a/5555470/8488611)はすべてを説明しています - "デフォルトの引数は呼び出し時ではなく関数定義時に評価されます"。ですから、クラスの中を含むキーワード引数のデフォルト値は、私の場合は常に同じオブジェクトを指しています - 不変5。デフォルト値を変更したい場合は、 'field = [5 ] ' ' self.arg = arg [0] 'そして' Foo.field [0] = 10'です。それは正常に動作しますが、それは私のQuxの例よりも醜いです:) – KalyanKruno

+0

また、クラスプロパティまたはカスタムの可変整数オブジェクトを使用することができます。 –

答えて

0

ただNoneに引数を設定します。引数がにNoneであるかどうかをテストします。

class Foo(): 
    field = 5 
    def __init__(self, arg=None): 
     if arg is None: 
      self.arg = Foo.field 
     else: 
      self.arg = arg 

上記のロジックはまたに凝縮することができます:

self.arg = Foo.field if arg is None else arg 
+0

私はQuxのクラスの例でまったく同じことをしました。もっと簡単な方法はありますか? – KalyanKruno

関連する問題