2016-03-30 7 views
2

私はこのような何か場合:私は次のエラーを取得使用して、デフォルトの引数としてクラスメソッド

class MyClass(object): 
    def __init__(self, a=MyClass.f): 
     self.a = a 

    @classmethod 
    def f(): 
     print 'tump drump' 

:明らか

NameError: name 'MyClass' is not defined

を、私はこれを行うことができます:

class MyClass(object): 
    def __init__(self, a=None): 
     if a is None: 
       self.a = MyClass.f 
     else: 
       self.a = a 

しかし、クラスメソッドのデフォルト引数としてclassメソッドを使用するよりエレガントな方法はありますか?

答えて

3

いいえ、関数が作成されているので、の前には、のクラスオブジェクトがあります。ここでクラスを参照するクラスはなく、センチネル(Noneなど)を使用するのがこれを行う正しい方法です。

あなたはifスイートでaではなくself.aに割り当てた場合elseスイートを使用する必要がないことに注意してください:

class MyClass(object): 
    def __init__(self, a=None): 
     if a is None: 
       a = MyClass.f 
     self.a = a 

か、条件式を使用できます。

class MyClass(object): 
    def __init__(self, a=None): 
     self.a = MyClass.f if a is None else a 

を偶数:

class MyClass(object): 
    def __init__(self, a=None): 
     self.a = a or MyClass.f 

あなたがサポートする必要があるのは、真実オブジェクトだけです(関数オブジェクトは、たとえばブール値コンテキストでは常に「真」です)。

+0

これは意味があります。確認していただきありがとうございます。 – DevShark

関連する問題