2016-03-30 9 views
2

Wenn ich so etwas tun:Verwenden Class als Standardargument

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

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

ich die folgende Fehlermeldung erhalten:

NameError: name 'MyClass' is not defined

Offensichtlich konnte ich dies tun:

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

Aber Gibt es eine elegantere Methode, eine Klassenmethode als Standardargument einer Klassenmethode zu verwenden?

Antwort

3

Nein, gibt es nicht, weil die Funktionen vor das Klassenobjekt erstellt werden. Es gibt keine Klasse, auf die hier Bezug genommen werden kann, und die Verwendung eines Sentinels (wie None) ist der richtige Weg, dies zu tun.

Beachten Sie, dass keine Notwendigkeit besteht, eine else Suite verwenden, wenn Sie zu a zuweisen, anstatt self.a in der if Suite:

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

oder Sie einen bedingten Ausdruck verwenden:

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

oder sogar:

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

Wenn Sie nur truthige Objekte unterstützen müssen (Funktionsobjekte sind z. B. in einem booleschen Kontext immer 'wahr').

+0

Ok, das macht Sinn. Danke für die Bestätigung. – DevShark

Verwandte Themen